C++ 在同一个编译器(vc12)上编译时,是什么导致名称的差异?

C++ 在同一个编译器(vc12)上编译时,是什么导致名称的差异?,c++,visual-studio-2013,linker-errors,name-mangling,cpputest,C++,Visual Studio 2013,Linker Errors,Name Mangling,Cpputest,我目前正在尝试编译CppUTest库并将其与我的项目链接。我使用CMake为CppUTest库创建了一个Visual Studio 2013解决方案,并构建了该解决方案 但是,当我将创建的CppUTest.lib链接到我的应用程序时,我收到一个链接器错误,告诉我它找不到多个符号,例如 ??0Utest@@QAE@XZ) 或 ?RunAllTests@CommandLineTestRunner@@SAHHPAPAD@Z 现在,当我在lib和option/LINKERMEMBER上使用dumpbin

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

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

??0Utest@@QAE@XZ)

?RunAllTests@CommandLineTestRunner@@SAHHPAPAD@Z

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

??0Utest@@QEAA@XZ

?RunAllTests@CommandLineTestRunner@@SAHHPEAPEAD@Z

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

从Visual Studio命令提示符运行。你会得到:

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

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

您可以看到该属性出现在64位函数上。x64只有一个调用约定,不区分_cdecl和_thiscall

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


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

是,这表明构建库时使用的选项与您的项目略有不同。除了浏览选项并尝试找出不同之处之外,你没有什么可以做的。是的,我做了,但我什么也没发现,因为我忘记检查构建配置。不过还是要谢谢你,你说得对。我真的忘了将我的测试exe项目设置为64位。大多数情况下,我使用CMake创建项目,但在本例中,我只是想通过在VisualStudio中“手动”设置项目来快速试用该库。当然,我忘了将默认构建配置更改为x64。但是,感谢使用undname.exe实用程序提供的提示。我现在还没有找到那个工具。
Undecoration of :- "??0Utest@@QEAA@XZ"
is :- "public: __cdecl Utest::Utest(void) __ptr64"