0

我正在将旧的 C/C++ 实用程序库转换为托管的 IJW DLL。试图了解链接错误 LNK2020。我有一个 C/C++ 静态库现在被编译为一个带有 /CLR 的 DLL 和一个带有实用程序 lib DLL 作为参考的控制台应用程序。我在 DLL 中的所有 C 函数上都得到了未解析的令牌。对于库 DLL 中的一个 ref 类,我没有收到链接错误。

Error   1   error LNK2020: unresolved token (0A00000B) 
"void __clrcall BwLibM::Reallocx(void * *,unsigned int,class System::String ^,unsigned int)" (
?Reallocx@BwLibM@@$$FYMXPAPAXIP$AAVString@System@@I@Z)  C:\ICL5K\ICL5K\OPENSOUR.obj ICL5K

当我在实用程序 DLL 程序集上使用 dumpbin /exports 时,我没有得到任何导出的符号。

Microsoft (R) COFF/PE Dumper Version 11.00.50727.1
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file bwlibm.dll
File Type: DLL
  Summary
        4000 .data
       26000 .rdata
        1000 .reloc
        3000 .rsrc
        F000 .text

当我使用 dumpbin /relocations 时,我确实看到了未定义的函数,并且原型与 LNK2020 错误消息完全匹配。

FE5  HIGHLOW 100365E4  __mep@
?Reallocx@BwLibM@@$$FYMXPAPAXIP$AAVString@System@@I@Z ([MEP] 
 void __clrcall BwLibM::Reallocx(void * *,unsigned int,class System::String ^,unsigned int))

我应该在 dumpbin /export 输出中看到该功能吗?我尝试使用带有 __declspec(dllexport) 和 __declspec(dllimport) 的经典 DLL 导入/导出技术导出函数,但出现错误

错误 1 ​​错误 C3395: 'BwLibM::Reallocx' : __declspec(dllexport) 无法应用于具有 __clrcall 调用约定 C:\ICL5K\BwLibM\REALLOCX.CPP 34 1 BwLibM 的函数

其中一个实用程序函数的源代码如下所示:Reallocx.cpp

namespace BwLibM {
    void Reallocx(void **ptr, size_t nBytesI, System::String^ file, unsigned line)
    {
     . . .
    }
} // namespace BwLibM

===BwLibM.h==

namespace BwLibM {
 . . .
void Reallocx(void **ptr, size_t nBytesI, System::String^ file, unsigned line);
 . . .
}

几个月前我发布了一个类似的问题,解决方案是将库和应用程序上的字符集设置为多字节。在这种情况下,DLL 和控制台应用程序设置为多字节字符集,并且链接器错误仍然存​​在。

4

0 回答 0