如何修复此vs10不一致的dll链接警告?

mmr*_*mmr 10 c++ warnings visual-studio

在使用visual studio 10(32位版本)构建gdcm时,我正在尝试修复一系列警告:

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'
Run Code Online (Sandbox Code Playgroud)

函数调用本身看起来像:

XML_Parser XMLCALL
XML_ParserCreate(const XML_Char *encodingName)
{
   return XML_ParserCreate_MM(encodingName, NULL, NULL);
}
Run Code Online (Sandbox Code Playgroud)

哪里

#define XMLCALL __cdecl
Run Code Online (Sandbox Code Playgroud)

XMLPARSEAPI(XML_Parser)
XML_ParserCreate(const XML_Char *encoding);
Run Code Online (Sandbox Code Playgroud)

哪里

#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL
Run Code Online (Sandbox Code Playgroud)

#define XMLIMPORT __declspec(dllimport)
Run Code Online (Sandbox Code Playgroud)

如果我正确地阅读,那意味着链接始终是__cdecl通过XMLCALL--对吗?因为,如果是这样,那么警告是多余的,还是我误解了这个?

Han*_*ant 16

不,它抱怨__declspec(dllimport)函数定义中缺少但存在于函数声明中.您应该认真对待这一点,声明从DLL导入但出现在您的代码中的函数是没有意义的.你不可能两种方式.

这通常是由于缺少#define引起的.我认为您编辑了宏定义,但在构建DLL时,通常在构建命令(/ D)中指定一个宏.因此函数的声明使用dllexport而不是dllimport.这确保了函数从DLL导出.客户端代码使用相同的.h文件,但是在没有定义宏的情况下构建.它看到声明为dllimport的函数.

仔细看看XMLIMPORT宏定义,__declspec(dllexport)应该是关闭的.另一个诊断是设置导出的函数,使用Dumpbin.exe/exports可见.如果我猜对了,他们应该失踪.