1

我正在阅读一本 c++ 书籍,其中指出链接器通常传递的是混乱的名称,而不是原始名称。所以,我想看看错位的名字会是什么样子。因此,我创建了一个名为 Test 的类,它只包含函数签名并将其保存到一个名为 name_mangling.cpp 的文件中

然后在 main 方法中,我调用这些函数。我首先将文件编译为 .o,然后尝试将其与命令链接,例如

g++ -o name_mangling name_mangling.o

我希望看到损坏的名称,但 g++ 打印了实际名称,例如

undefined reference to `Test::Test(char const*)'

但另一方面,当我尝试链接到诸如 .so 之类的共享对象时,我看到了损坏的名称。为什么 g++ 在 .so 而不是上述情况下打印损坏的名称?

4

1 回答 1

3

它不会显示损坏的名称,因为它知道用代码编写的实际/真实名称。考虑到您可能只是拼错了一些名称(而且这些名称更难处理),显示错误的名称会适得其反。

如前所述,在 Linux/GCC 下有一个“nm”工具来打印损坏的名称。在 Windows 下,您可以尝试Dependency Walker,它曾经是 Visual C++ 示例的一部分,对于确保您拥有启动时所需的所有动态链接库也非常有用。

于 2012-08-05T17:56:08.977 回答