2

我目前正在尝试编译 CppUTest 库并将其与我的项目链接。我使用 CMake 为 CppUTest 库创建了一个 Visual Studio 2013 解决方案并构建了它。

但是,当我将创建的 CppUTest.lib 链接到我的应用程序时,我收到一个链接器错误,告诉我它找不到多个符号,例如

??0Utest@@QAE@XZ)

或者

?RunAllTests@CommandLineTestRunner@@SAHHPAPAD@Z

现在,当我在 lib 和选项 /LINKERMEMBER 上使用 dumpbin.exe 时,我得到了库中包含名称的符号列表

??0Utest@@QEAA@XZ

?RunAllTests@CommandLineTestRunner@@SAHHPEAPEAD@Z

所以实际存在的名称与我的项目期望的名称略有不同,我不知道是什么导致了这个问题。是否有任何编译选项会导致这些更改,或者我是否使用不同的编译器,尽管我认为它是相同的?

4

1 回答 1

5

从 Visual Studio 命令提示符运行undname.exe 实用程序。你得到:

Undecoration of :- "??0Utest@@QAE@XZ"
is :- "public: __thiscall Utest::Utest(void)"

Undecoration of :- "??0Utest@@QEAA@XZ"
is :- "public: __cdecl Utest::Utest(void) __ptr64"

很清楚,这是 Utest 类的默认构造函数。请注意调用约定有何不同,__thiscall 与 __cdecl。以及库版本如何具有 __ptr64 属性。

您会看到该属性出现在 64 位函数上。x64 只有一种调用约定,不区分 __cdecl 和 __thiscall。

所以它应该开始变得明显,链接器想要第一个,32 位版本的构造函数。您提供的 64 位版本永远无法工作,因为您不能混合 32 位和 64 位代码。对此也应该有一个响亮的警告,不要忽视这样的警告。

链接到此库的 32 位版本以解决您的问题。或者构建程序的 x64 版本。

于 2015-12-05T10:34:21.270 回答