最近更新了GCC 4.8的文档,现在引入了一个新的优化开关-Og.这个
[..]解决了快速编译和卓越调试体验的需求,同时提供了合理的运行时性能.总体开发经验应优于默认优化级别-O0.
此切换是否暗示-g或我是否必须CXXFLAGS手动将其添加到我的手中?
Lek*_*eyn 27
看一下GCC 4.9.2源代码(gcc/opts.c)显示它-Og是相同的-O1,但是禁用了一些标志会导致更糟糕的调试体验:
/* in function default_options_optimization: */
case OPT_Og:
/* -Og selects optimization level 1. */
opts->x_optimize_size = 0;
opts->x_optimize = 1;
opts->x_optimize_fast = 0;
opts->x_optimize_debug = 1;
break;
Run Code Online (Sandbox Code Playgroud)
几步之后,maybe_default_option使用一组选项和x_optimize_debug标志调用函数.标有选项OPT_LEVELS_1_PLUS_NOT_DEBUG,OPT_LEVELS_1_PLUS_SPEED_ONLY而OPT_LEVELS_2_PLUS_SPEED_ONLY当将不被启用-Og时使用.
所以这就是声明"应该比-O0更好"的地方.-Og介于-O0和之间-O1.这不会影响包含将通过-g选项启用的调试信息.您可能也会对不同的-g选项感兴趣:
-ggdb覆盖-g.也就是说,如果您-ggdb在之后设置-g,则-g有效地忽略该选项.-g等于-g2和省略-g是相同的-g0.-g3产生比较大的调试部分-g2也是如此-ggdb3抵抗-ggdb2.-O0< -O1< -Og< -O2< -O3).strip --strip-debug导致相同的对象大小独立于-g级别.这符合预期,即只有-O级别对-g确定调试部分的实际代码有影响.strip --keep-debug导致对象的大小由-g关卡控制,其次是-O关卡.(所以-g0 -O3小于-g3 -O0).注意:这里我没有考虑编译的时间.随着更积极的优化级别,它可能会增加.我希望调试级别只会对时间产生轻微影响(与优化相比),因为它只是意味着需要在传递过程中跟踪额外的细节.
这是我用来测试实际行为的命令(也比较-ggdbX而不是-gX):
for g in -g0 -g2 -g3;do
for O in -O0 -O1 -O2 -O3 -Og; do
flags="$g $O";
gcc -fPIC -rdynamic -c -Wall -Wextra -Ilib ltunify.c -o obj/gL_"${flags// /_}_.o" $flags || break;
done;
done
Run Code Online (Sandbox Code Playgroud)
pat*_*cek 17
简答:不,你还必须-g手动添加.
答案很长:
我一直在努力寻找源代码的硬答案,所以我决定使用这里描述的方法自己测试:如何检查程序是否使用调试符号编译?
我用-O3旗帜构建了一个可执行文件而没有-g.objdump --syms <file> | grep debug正如所料,使用没有产生任何结果.
然后我构建了一个带有-g和不带任何优化标志的可执行文 同样的objdump命令产生了六个结果,例如:
0000000000000000 l d .debug_info 0000000000000000 .debug_info
我终于用-Og旗帜构建了一个可执行文件而没有-g.这objdump命令什么都没产生.这意味着在这种情况下不存在调试符号.
虽然我找不到GCC本身的任何明确的文档,但是Gentoo Wiki(正如Marco Scannadinari之前提到的那样)证实了我的断言-Og并不意味着-g.