VS2010升级后无法链接到lib(__cdecl vs __thiscall?)

Posted

技术标签:

【中文标题】VS2010升级后无法链接到lib(__cdecl vs __thiscall?)【英文标题】:Can't link to lib after VS2010 upgrade (__cdecl vs __thiscall?) 【发布时间】:2012-09-11 15:57:11 【问题描述】:

非常感谢您的帮助,我的前额被擦伤了。

我们有一个大型的开源 DICOM 库 (dcmtk),我们将其用作静态库。它是非托管 C++,我们从包装它的托管 C++ DLL 链接到它。它使用 CMake 来调整各种平台的构建指令。迁移到 VS2010(从 2008 年开始)破坏了我们的构建,因此我们也借此机会更新了我们正在使用的库版本(这应该对 VS2010 更友好)。在对 lib 进行了一些修改之后,现在构建(给出或接受关于类型转换的无数警告)。但是现在使用它的代码不会链接到它。它会抛出一堆未解决的外部符号错误。

它发现库正常(如果我更改 lib 文件名,它会在之前使用适当的 msg 报错)。

如果我使用 DUMPBIN 反汇编 lib 文件,我会看到相应的标记,例如: … 000000000000000E: C3 ret

??1OFString@@QEAA@XZ (public: __cdecl OFString::~OFString(void))

0000000000000000: 40 53              push        rbx…

但链接器没有找到它:

error LNK2001: unresolved external symbol "public: __thiscall OFString::~OFString(void)" (??1OFString@@QAE@XZ)

我一直在研究这是 __cdecl vs. __thiscall 不匹配的理论,但无法让 VS 使用任何其他约定来构建库。 (具有讽刺意味的是,emit __thiscall 的旧 2008 版本似乎是使用我认为 forces __cdecl 的 /Gd 选项编译的。

有什么见解吗?

【问题讨论】:

【参考方案1】:

你可以看到名字 mangling 是不同的。使用 undname.exe 可能会对您的事业有所帮助:

Undecoration of :- "??1OFString@@QEAA@XZ"
is :- "public: __cdecl OFString::~OFString(void) __ptr64"

对比:

Undecoration of :- "??1OFString@@QAE@XZ"
is :- "public: __thiscall OFString::~OFString(void)"

另外,您是在混合使用 x64 和 x86 吗?

【讨论】:

看对了,并没有看到 mangle 的区别——谢谢。该库正在为 x64 构建。托管 DLL 正在构建 Win32,现在设置为 x64,它只剩下几十个未解析的符号。上面的一个已解决...将找到剩余的详细信息...

以上是关于VS2010升级后无法链接到lib(__cdecl vs __thiscall?)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV4.5.2 无法解析的外部符号 “public: void __cdecl cv::Mat::copyTo, imread失败

OpenCV4.5.2 无法解析的外部符号 “public: void __cdecl cv::Mat::copyTo, imread失败

OpenCV4.5.2 无法解析的外部符号 “public: void __cdecl cv::Mat::copyTo, imread失败

MFC程序出现uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)解决办法(

Visual Studio _MSC_VER 与平台工具集

VS2010无法解析的外部错误...