任何帮助都非常感激,我的额头受伤了。
我们有一个大型开源DICOM
库(dcmtk
),我们将其用作静态库。它是非托管的C ++,我们从包装它的托管C++ DLL
链接到它。它使用CMake来完成各种平台的构建指令。迁移到VS2010
(从2008年开始)打破了我们的构建,因此我们借此机会更新了我们正在使用的库版本(应该更加VS2010
友好)。现在构建了一些关于lib的解决方案(给出或接受关于类型转换的大量警告)。但是现在使用它的代码不会链接到它。它抛出了一堆未解决的外部符号错误。
它找到了库好的(如果我更改了lib文件名,它会在之前用适当的消息来解决)。
如果我用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
不匹配的理论,但是还没有能够用任何其他约定来构建lib。 (具有讽刺意味的是旧的2008版本emit __thiscall
,似乎是用/ Gd选项编译的,我认为是forces __cdecl
)。
任何见解?
答案 0 :(得分:4)
你可以看到名称错误不同。使用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吗?