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)解决办法(