我正在阅读一本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的情况下打印出受损的名称,而不是上述情况?
答案 0 :(得分:3)
它不会显示受损的名称,因为它知道用代码写的实际/真实名称。考虑到你可能只有一些拼写错误的名字(并且更糟糕的名字更难处理),显示错位的名称会适得其反。
如上所述,在Linux / GCC下,有“nm”工具可以打印受损的名称。在Windows下,您可以尝试Dependency Walker,它曾经是Visual C ++示例的一部分,对于确保启动时需要所有动态链接库也非常有用。