2

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

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

它找到了库 OK(如果我更改了 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 使用任何其他约定来构建库。(具有讽刺意味的是,2008 年的旧版本emit __thiscall似乎是用我认为的 /Gd 选项编译的forces __cdecl)。

有什么见解吗?

4

1 回答 1

4

您可以看到名称 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 吗?

于 2012-09-11T16:56:48.213 回答