0

我有一个 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)

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

就像我忘了做 __declspec(dllimport/dllexport) 宏一样,但我做到了。

我尝试将 CLASS_EXPORT 放在导出的每个方法上,并在类声明的第一行尝试了它,没有任何变化。

4

1 回答 1

1

看起来 for 的定义CreateDataArea()没有限定在类中(即,您CCommonMemory::在定义函数时省略了 a )。

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

于 2013-03-10T23:33:42.577 回答