【发布时间】:2016-06-10 15:24:19
【问题描述】:
按照官方说明,要编译一个支持调试的程序,你可以运行
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>
在多次尝试修改编译器选项后,它完全工作了(上述选项适用于工作版本)。在某些情况下,C 符号会加载,但 C++ 符号不会。
有人可以解释一下推荐的选项是什么,以便为混合多种编译语言的非平凡示例启用调试?所有文档仅涉及琐碎的示例。
【问题讨论】:
-
与您的问题无关,但可执行程序不应具有
.so后缀,它用于 共享对象(即动态库或 DLL)。在 Linux 或 OSX 等 POSIX 系统上,可执行程序通常没有后缀。 -
至于你的问题,GCC 总是使用
-g选项来添加调试信息,不管是什么语言。使用-O0禁用优化也是一个好主意。就是这样。 -
链接步骤也需要
-g选项。如果要通过gdb进行调试,那么编译和链接步骤的正确选项是-ggdb,因为这样可以提供更多gdb可以使用的信息。 -
当编译/链接语句缺少
-std=...选项时,编译器将使用默认标准。 (通常是 c89 或类似的)所以所有对 gcc(和/或 g++)的调用都应该引用适当的标准。 -
gdb实用程序只有在与可执行文件位于同一目录时才能自动找到源文件。对于所有其他情况,必须专门加载源文件。