当我想调试C或C ++程序时,我被教导使用
-O0
关闭优化,并使用-ggdb
将符号插入可执行文件中,这些符号经过优化,适用于GNU gdb
调试器,我使用它(或者您可以使用-glldb
用于LLVM / clang的lldb
调试器,或者只是-g
用于一般调试符号,但是这不会像-ggdb
那样好...)。但是,最近我偶然听到有人说要使用-Og
(而不是-O0
),这让我措手不及。不过,man gcc
中确实有这个选项!:
-Og
优化调试体验。-Og
启用不会干扰调试的优化。它应该是标准编辑-编译-调试周期的优化级别,提供合理的优化水平,同时保持快速编译和良好的调试体验。
那么,有什么区别吗?这里是来自man gcc
的-O0
描述:
-O0
减少编译时间并使调试产生预期结果。这是默认设置。
man gcc
明确表示 -Og
“应该是标准编辑-编译-调试循环的优化级别选择”,但是。
这听起来像是 -O0
确实是“没有优化”,而 -Og
是“开启了一些优化,但仅限于不干扰调试的优化。” 这是正确的吗?那么,我应该使用哪个,为什么?
相关:
- 相关但不是重复的问题!(仔细阅读,它根本不是重复的): -O0、-O1 和 -g 之间的区别是什么?
- 我在与 Bazel 一起使用的调试
--copt=
设置上的答案:gdb:当前上下文中没有符号“i”
man gcc
里的信息更多! - Gabriel Staples-Og
优化了调试体验,而-O0
则最小化了编译速度。如果你想享受调试过程,就要使用-Og
;如果你想快速找出是否编译成功,就要使用-O0
。 - Antti Haapala -- Слава Україні-Og
居然存在)。 - Gabriel Staples