2011-03-17 51 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