-O0、-O1和-g之间有什么区别
What is the difference between -O0 ,-O1 and -g
我想知道在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-选项
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?