【问题标题】:Link error with name mangling declspec mismatch in Visual C++ 2008 application at link time链接时 Visual C++ 2008 应用程序中名称修饰 declspec 不匹配的链接错误
【发布时间】:2013-03-10 23:22:43
【问题描述】:

我有一个 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 放在每个导出的方法上,我在类声明的第一行尝试了它,没有任何变化。

【问题讨论】:

  • 仔细观察。您正在导出全局函数但导入成员函数。这就是他们不匹配的原因。
  • 我觉得自己像个白痴!

标签: c++ visual-c++ visual-studio-2008-sp1


【解决方案1】:

看起来CreateDataArea() 的定义没有被限定到类(即,您在定义函数时遗漏了CCommonMemory::)。

如果您查看地图文件中的内容,您会发现它是一个 __cdecl 函数,没有“附加”类名。

【讨论】:

  • 这和我一样,为平庸的错误寻找奇异的解释。
猜你喜欢
  • 2011-08-26
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
相关资源
最近更新 更多