Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++_C_Gcc_Gdb - Fatal编程技术网

C++ 公开使用多种语言编译的程序的调试符号

C++ 公开使用多种语言编译的程序的调试符号,c++,c,gcc,gdb,C++,C,Gcc,Gdb,按照官方指示,要编译一个支持调试的程序,您可以运行 g++ -std=c++11 -O0 -g -c -o program1.o program1.cpp 现在用C程序做同样的事情,它只是: gcc -O0 -g -c -o program2.o program2.c 为了将这两种类型链接在一起,我可以使用: g++ --std=c++11 -O0 -g -o program program.o program2.o 然后,要调试: gdb program gdb > run &

按照官方指示,要编译一个支持调试的程序,您可以运行

g++ -std=c++11 -O0 -g -c -o program1.o program1.cpp 
现在用C程序做同样的事情,它只是:

gcc -O0 -g -c -o program2.o program2.c
为了将这两种类型链接在一起,我可以使用:

g++ --std=c++11  -O0 -g -o program program.o program2.o
然后,要调试:

gdb program
gdb > run <PARAMS>
gdb程序
gdb>运行
在多次尝试修补编译器选项后,它完全工作了(上面的选项适用于工作版本)。在某些情况下,C符号将加载,但C++符号不会加载。p>
有人能解释一下,对于混合了多种编译语言的非平凡示例,推荐的调试选项是什么吗?所有的文档都只涉及一些琐碎的例子

请注意,如果只使用
-g
选项,编译器将使用操作系统的本机格式,该格式可能会有所不同。您可以使用其他
-g..
变体(例如
-gdwarf-3
-g-stabs
)来明确指定格式。这允许您保证对象文件都具有一致的调试格式,而不管它们是在哪里生成的


如果希望使用其他调试器,还可以使用此方法禁用仅限gdb的扩展。有关详细信息,请参阅。

在每个编译和链接步骤中,将
-g
选项添加到编译器标志中<代码>-O0也建议用于调试构建,这样您就不会失去编译器优化功能。不一致可能导致没有调试符号或部分调试符号

与您的问题无关,但可执行程序不应具有
。因此
后缀,它用于共享对象(即动态库或DLL)。在POSIX系统上,如Linux或OSX,可执行程序通常没有后缀。至于您的问题,GCC总是使用
-g
选项来添加调试信息,无论使用何种语言。使用
-O0
禁用优化也是一个好主意。仅此而已。链接步骤还需要
-g
选项。如果要通过
gdb
进行调试,那么编译和链接步骤的正确选项都是
-ggdb
,因为这使得
gdb
可以使用更多的信息,编译器将使用默认标准。(通常为c89或类似),因此对gcc(和/或g++)的所有调用都应参考适当的标准。
gdb
实用程序只能在源文件与可执行文件位于同一目录时自动查找源文件。对于所有其他情况,必须专门加载源文件。