Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何编译C++;在gcc(g+;+;)中编写代码以查看重载函数上的名称是否损坏?_C++_Linux_Gcc - Fatal编程技术网

C++ 如何编译C++;在gcc(g+;+;)中编写代码以查看重载函数上的名称是否损坏?

C++ 如何编译C++;在gcc(g+;+;)中编写代码以查看重载函数上的名称是否损坏?,c++,linux,gcc,C++,Linux,Gcc,我有重载函数,如: void f(int) void f(int, int) void f(int, float) 如何编译它,以便我可以看到损坏的输出? 比如: void f(int) should show: ?f@@YAXH@Z(int) 例如,为了查看预处理器输出,我们使用了-E,汇编程序输出-s,名称被破坏的输出是什么 附言:平台是Linux 编辑: 根据这里的答案: void func(int); void func(int, int); void func(void); voi

我有重载函数,如:

void f(int)
void f(int, int)
void f(int, float)
如何编译它,以便我可以看到损坏的输出? 比如:

void f(int) should show: ?f@@YAXH@Z(int)
例如,为了查看预处理器输出,我们使用了
-E
,汇编程序输出
-s
,名称被破坏的输出是什么

附言:平台是Linux

编辑:

根据这里的答案:

void func(int);
void func(int, int);
void func(void);
void func(char);

[root@localhost ~]# cat a.map | grep func
                0x0804881a                _Z4funcc
                0x08048790                _Z4funcv
                0x080487be                _Z4funcii
                0x080487ec                _Z4funci

在Linux中,我可以通过
nm
查看所有符号的名称。例如:

$ nm a.out | grep pthread
                 w pthread_cancel@@GLIBC_2.2.5
                 U pthread_key_create@@GLIBC_2.2.5
                 U pthread_key_delete@@GLIBC_2.2.5

在编译器/链接器中应该有一些选项来创建映射文件。
在该文件中,您可以看到所有函数和方法的损坏名称。

-S
选项告诉GCC只编译而不组装函数。也就是说,它将输出人类可读的汇编文本,在其中您将能够看到函数名。通过
c++filt
运行它,以便将损坏的名称与未混合的名称关联起来。

对于GCC,请尝试使用:

-Xlinker -Map=output.map

这将生成一个映射文件,其中包含所有损坏的符号名称

对于MSVC:

这将生成以下内容:

0002:00094190       ??0SerializationException@EM@@QAE@ABV01@@Z 10148190 f i y:foo.obj

在不实现函数的情况下调用函数,链接器会在错误消息中告诉您损坏的名称。:)一旦你有了汇编程序,
c++filt myProg.s | diff-myProg.s
应该会提供你需要的信息。你的答案也能达到目的,谢谢你让我们知道实现相同目标的另一种方法,但我一次只能接受一个答案(不幸的是),因为我是从gcc的角度问这个问题的,所以另一个更接近,答案很好。你的和chrisaycock都是为了这个目的,但是因为我是从gcc的角度来问的,所以我应该选择你的。谢谢:-)@kingsmasher1我很好奇为什么我的没有“达到目的”。这是特定于编译器的。我可能说过应该这样做,但我的意思是真的有这样的开关。保罗的回答最终表明了这一点。是的,我的意思是,询问者已经说过哪一个是它的编译器(gcc)。你的答案本身并没有错,但对这个问题,它并不是一个真正的答案。希望你明白我的意思;你的帖子应该是评论:)