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

问题描述 投票:0回答:1

我在使用 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 —— 对吗? 因为,如果是这样,那么警告就是多余的,还是我误解了这一点?

c++ visual-studio warnings
1个回答
19
投票

不,它抱怨函数定义中缺少

__declspec(dllimport)
但出现在函数声明中。 您应该认真对待这一点,声明从 DLL 导入但又出现在代码中的函数是没有意义的。 你不能两全其美。 这通常是由于缺少#define 造成的。 我认为您编辑了宏定义,但是在构建 DLL 时,您通常在构建命令 (/D) 中指定宏。 以便函数的声明使用dllexport而不是dllimport。 这确保了函数从 DLL 中导出。 客户端代码使用相同的 .h 文件,但在构建时未定义该宏。 它看到声明为 dllimport 的函数。

仔细看看XMLIMPORT宏定义,

__declspec(dllexport)

应该很接近。 另一个诊断是导出函数集,可通过 Dumpbin.exe /exports 看到。 如果我猜对的话,他们应该失踪了。

    

© www.soinside.com 2019 - 2024. All rights reserved.