2012-08-05 36 views
1

我正在阅读一本C++书,其中指出链接器通常会传递重叠名称而不是原始名称。所以,我正在试图看看会出现什么样的重叠名称。因此,我创建了一个名为Test的类,它只包含函数签名并将其保存到名为name_mangling.cpp的文件中。打印C++名字mangling

然后在主方法中,我调用这些函数。我首先编译该文件以.O然后试图与命令如

g++ -o name_mangling name_mangling.o 

我希望看到错位的名称链接,但克++印刷实际名称如

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

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

+6

如果你只是想看看这些被破坏的名字,只要说'nm name_mangling.o',它应该在对象文件中列出符号。 – 2012-08-05 17:51:19

+0

非常好,谢谢。 – Jimm 2012-08-05 17:54:53

回答

3

它不会显示重名的名称,因为它知道用代码编写的实际/真实名称。显示错位的名字将会适得其反,因为你可能只是拼错了一些名字(而且名字更难处理)。

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