Visual c++ 2008应用程序在链接时出现的名称混淆(declspec)不匹配的链接错误

Link error with name mangling declspec mismatch in Visual C++ 2008 application at link time

本文关键字:链接 declspec 错误 不匹配 c++ 应用程序 Visual 2008      更新时间:2023-10-16

我有一个DLL和一个主可执行文件,主可执行文件不再链接DLL的导入库中的符号,DLL .map文件中的declspec不匹配,也不匹配破损的c++名称。我不明白为什么,虽然我做了通常的事情你做当你不能得到c++的东西链接。

我的头文件定义如下:

#ifdef MY_MODULE
#undef CLASS_EXPORT
#define CLASS_EXPORT __declspec(dllexport)
#else
#undef CLASS_EXPORT
#define CLASS_EXPORT __declspec(dllimport)
#endif

我的类似乎导出正确,但.map文件表明一些奇怪的事情,我认为是错误的:

    6    ?CreateDataArea@@YAKPAGPBD111PAVCObject@@K@Z (unsigned long __cdecl 
    CreateDataArea(unsigned short *,char const *,char const *,char const *,
    char const *,class CObject *,unsigned long))

上面的名字有@@YAK...

链接错误是:

1>Device.obj : error LNK2019: unresolved external symbol 
"__declspec(dllimport) public: unsigned long __thiscall 
CCommonMemory::CreateDataArea(unsigned short *,char const *,char const *,
char const *,char const *,class CObject *,unsigned long)" 
(__imp_?CreateDataArea@CCommonMemory@@QAEKPAGPBD111PAVCObject@@K@Z) referenced 
in function "public: __thiscall CDevice::CDevice(void)" (??0CDevice@@QAE@XZ)

那么,当我配置declspec宏时,为什么损坏的名称@@QAEK不同,为什么当宏定义__declspec(dllexport)时,.map文件显示__thiscall调用约定?

这就像我忘记做__declspec(dllimport/dllexport)宏一样,但我还是做了。

我试着把CLASS_EXPORT放在每个导出的方法上,我试着在类声明的第一行,没有改变。

看起来CreateDataArea()的定义没有作用于类(即。(在定义函数时遗漏了一个CCommonMemory::)。

如果您查看map文件中的内容,您将看到它是一个没有附加类名的__cdecl函数