-O0、-O1和-g之间有什么区别

What is the difference between -O0 ,-O1 and -g

本文关键字:什么 区别 之间 -O1 -O0      更新时间:2023-10-16

我想知道在lib中使用-O0、-O1和-g来启用调试符号。有些建议使用-O0来启用调试符号,有些建议使用-g。

那么,-g和-O0之间的实际区别是什么,-01和-O0的区别是什么以及最好使用哪个。

-O0是优化级别0(无优化,与省略-O参数相同)

CCD_ 2是优化级别1。

-g生成调试符号并将其嵌入二进制文件中。

请参阅gcc文档和手册页以获得进一步的解释。

对于进行实际调试,调试器通常无法理解使用优化编译的内容,尽管调试符号对其他事情也很有用,例如生成堆栈跟踪。

-OX指定编译器将执行的优化级别。-g用于生成调试符号。

来自GCC手动

http://gcc.gnu.org/onlinedocs/

3.10控制优化的选项`

-O

-O1

优化。优化编译需要更多的时间,对于一个大函数来说需要更多的内存。使用-O,编译器会尝试减少代码大小和执行时间,而不会执行任何占用大量编译时间的优化

-O2

优化更多。GCC执行几乎所有支持的优化,这些优化不涉及空间-速度折衷。与-O相比,此选项增加了编译时间和生成代码的性能

-O3

优化更多-O3打开-O2指定的所有优化,还打开-finline函数、-funswitch循环、-fpreactive公用、重新加载后的-fgcse、-ftree矢量化和-fipa-cp克隆选项

-O0

减少编译时间,使调试产生预期的结果。这是默认设置。`

-g

以操作系统的本机格式(stabs、COFF、XCOFF或DWARF2)生成调试信息。GDB可以使用此调试信息

-O0不启用调试符号,它只是在生成的代码中禁用优化,以便调试更容易(汇编代码或多或少直接遵循C代码)。-g告诉编译器生成用于调试的符号。

可以为优化后的代码生成符号(只需继续指定-g),但尝试遍历代码或设置断点可能无法如您所期望的那样工作,因为发出的代码可能不会"紧跟"原始C源代码。因此,在这种情况下进行调试可能会相当棘手。

-O1(与-O相同)执行一组最小的优化。-O0本质上告诉编译器不要进行优化。有很多选项可以非常精细地控制编译器的执行方式:http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Optimize-Options.html#Optimize-选项

正如其他人所提到的,-O选项集指示编译器必须完成的优化级别,而-g选项则添加调试符号。

欲了解更多详细信息,请参阅以下链接

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-选项http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-选项