我在使用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'
函数调用本身如下:
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)
如果我正确地阅读,那意味着连接始终是__cdecl通过XMLCALL--对吗?因为,如果是这样,那么警告是多余的,还是我误解了这个?
答案 0 :(得分:16)
不,它抱怨函数定义中缺少__declspec(dllimport)
但在函数声明中出现。您应该认真对待这一点,声明从DLL导入的函数,但代码中存在也是没有意义的。你无法双管齐下。
这通常是由于缺少#define引起的。我认为你编辑了宏定义,但是在构建DLL时,通常在构建命令(/ D)中指定一个宏。因此函数的声明使用dllexport而不是dllimport。这确保了函数从DLL导出。客户端代码使用相同的.h文件,但是在没有定义宏的情况下构建。它看到声明为dllimport的函数。
仔细查看XMLIMPORT宏定义,__declspec(dllexport)
应该关闭。另一个诊断是设置导出的函数,使用Dumpbin.exe / exports可见。如果我猜对了,就应该丢失它们。