【问题标题】:What causes difference in mangled names when compiling on the same compiler (vc12)?在同一个编译器(vc12)上编译时,是什么导致了重名的不同?
【发布时间】:2016-03-10 06:48:38
【问题描述】:

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

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

??0Utest@@QAE@XZ)

?RunAllTests@CommandLineTestRunner@@SAHHPAPAD@Z

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

??0Utest@@QEAA@XZ

?RunAllTests@CommandLineTestRunner@@SAHHPEAPEAD@Z

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

【问题讨论】:

  • 是的,这表明该库的构建选项与您的项目略有不同。除了浏览选项并尝试找出不同之处之外,您无能为力。
  • 是的,我这样做了,但我什么也没找到,因为我忘了检查构建配置。不过还是谢谢你。

标签: c++ visual-studio-2013 linker-errors name-mangling cpputest


【解决方案1】:

从 Visual Studio 命令提示符运行 undname.exe utility。你得到:

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 版本。

【讨论】:

  • 你是对的。我真的忘记将我的测试 exe 项目设置为 64 位。大多数时候我使用 CMake 来创建项目,但在这种情况下,我只想通过“手动”在 Visual Studio 中设置项目来快速试用该库。当然,我忘记将默认构建配置更改为 x64。但是感谢使用 undname.exe 实用程序的提示。我现在还没有那个工具。
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
相关资源
最近更新 更多