我在使用 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)
如果我没看错的话,这意味着链接始终是通过 XMLCALL __cdecl —— 对吗? 因为,如果是这样,那么警告就是多余的,还是我误解了这一点?
不,它抱怨函数定义中缺少
__declspec(dllimport)
但出现在函数声明中。 您应该认真对待这一点,声明从 DLL 导入但又出现在代码中的函数是没有意义的。 你不能两全其美。
这通常是由于缺少#define 造成的。 我认为您编辑了宏定义,但是在构建 DLL 时,您通常在构建命令 (/D) 中指定宏。 以便函数的声明使用dllexport而不是dllimport。 这确保了函数从 DLL 中导出。 客户端代码使用相同的 .h 文件,但在构建时未定义该宏。 它看到声明为 dllimport 的函数。
仔细看看XMLIMPORT宏定义,
__declspec(dllexport)
应该很接近。 另一个诊断是导出函数集,可通过 Dumpbin.exe /exports 看到。 如果我猜对的话,他们应该失踪了。