2011-03-17 68 views
10

我有一系列的警告,我試圖用visual studio 10建設gdcm時修復(32位版本):如何解決這個vs10不一致的dll聯動警告?

4>..\..\..\..\gdcm\Utilities\gdcmexpat\lib\xmlparse.c(647): warning C4273: 'XML_ParserCreate' : inconsistent dll linkage 
4>   d:\src\gdcm\gdcm\utilities\gdcmexpat\lib\expat.h(206) : see previous definition of 'XML_ParserCreate' 

函數調用本身看起來像:

XML_Parser XMLCALL 
XML_ParserCreate(const XML_Char *encodingName) 
{ 
    return XML_ParserCreate_MM(encodingName, NULL, NULL); 
} 

哪裏

#define XMLCALL __cdecl 

XMLPARSEAPI(XML_Parser) 
XML_ParserCreate(const XML_Char *encoding); 

其中

#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL 

#define XMLIMPORT __declspec(dllimport) 

如果我讀,妥善,這意味着聯動始終通過XMLCALL--權__cdecl?因爲,如果是這樣,那麼警告是多餘的,還是我誤解了這個?

回答

16

不,這是抱怨__declspec(dllimport)從函數定義失蹤,但存在於函數聲明。你應該重視這一點,就沒有意義了聲明從DLL導入的功能,而且還目前在你的代碼。你不能兩面都有。

這通常是由丟失的#define引起的。我認爲你編輯了宏定義,但是在構建DLL時,通常在構建命令(/ D)中指定一個宏。因此,該函數的聲明使用dllexport而不是dllimport。這確保函數從DLL中導出。客戶端代碼使用相同的.h文件,但沒有定義該宏。它將該函數聲明爲dllimport。

拿在XMLIMPORT宏定義定睛一看,__declspec(dllexport)應該接近。另一個診斷是設置導出的函數,通過Dumpbin.exe/exports顯示。如果我猜對了,他們應該會失蹤。

+0

這就是它 - 這dllimport的應該是一個DLLEXPORT。 – mmr 2011-03-17 22:14:46

+0

哇,我錯過了一個變量被導出。在標頭,我有這樣的事情'COMMON_API的extern常量的std :: string someStr;'而在cpp文件我'常量的std :: string someStr(「背景」);'這是缺少出口/進口符。 API宏根據項目是否定義了一個宏來改變團隊,告訴它是否爲dll構建。我必須密切注意這一點。 – jxramos 2016-07-19 18:00:55