打印c++;名字改编 我正在阅读一本C++书,它指出链接器通常是经过了名字的,而不是原来的名字。所以,我想看看被弄坏的名字会是什么样子。因此,我创建了一个名为Test的类,它只包含函数签名,并将其保存到名为name_mangling.cpp的文件中

打印c++;名字改编 我正在阅读一本C++书,它指出链接器通常是经过了名字的,而不是原来的名字。所以,我想看看被弄坏的名字会是什么样子。因此,我创建了一个名为Test的类,它只包含函数签名,并将其保存到名为name_mangling.cpp的文件中,c++,C++,然后在main方法中,我调用这些函数。我首先将文件编译为.o,然后尝试使用以下命令链接它 g++ -o name_mangling name_mangling.o 我本来希望看到被损坏的名字,但是g++打印了实际的名字,比如 undefined reference to `Test::Test(char const*)' 但另一方面,当我试图链接到一个共享对象(如.so)时,我看到了一些被损坏的名称。为什么g++在.so而不是上面的情况下打印损坏的名称?它不会显示损坏的名称,因为它知道用代码

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

g++ -o name_mangling name_mangling.o
我本来希望看到被损坏的名字,但是g++打印了实际的名字,比如

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

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

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


如前所述,在Linux/GCC下有一个“nm”工具来打印损坏的名称。在Windows下,您可以尝试使用它,它是VisualC++的一部分,并且对于确保启动时需要的所有动态链接库也是非常有用的。只需说
nm name\u mangling.o
——它应该列出目标文件中的符号。如果您试图grep各种库的nm输出以查看哪个库包含定义,则不一定会适得其反。。。