默认的 gcc 编译器选项是特定于 gcc 版本还是特定于 OS 或两者?

Are default gcc compiler options gcc version specific or OS specific or both?

我想知道默认的 gcc 编译器选项是否可以有所不同,如果可以的话,我可以期待不同的默认编译器选项。默认编译器选项是否因 gcc 版本而异(例如 gcc 4.6 -> gcc 4.8),还是它们始终相同?默认编译器选项是否因一个 OS 版本而异(例如 Ubuntu 12.04 -> 14.04)?

我希望默认编译器选项对于两个不同的 OS 是不同的,比如 Ubuntu 和 Debian,对吗?

我建议您利用 automake 等工具为您的应用程序构建 Makefile。该工具可以根据环境以不同的方式构建文件。然后,在该 Makefile 中,指定 对您重要的选项:不要将它们保留为默认值 ("to chance")。

是的,您通常可以预期默认标志会有很大不同。幸运的是,你不需要知道标志是什么,也不需要设置它们。

Ubuntu 和 Debian 非常相似,因为 Ubuntu 非常基于 Debian。但是您会看到各种不同的选项,因为 GCC 使用的实际选项是相当技术性的。您可以通过 运行 以下内容查看它们:

gcc -Q -v -x c -c /dev/null

这要求 GCC 将 /dev/null 编译为 C 程序 (-x c -c /dev/null) 并打印出一堆开发人员信息 (-Q -v)。我 运行 使用 GCC 4.4、4.6 和 4.8 并得到了不同的结果。以下是我机器上 4.4 和 4.6 选项之间的差异:

< -falign-loops
< -fargument-alias
> -fdelete-null-pointer-checks
> -fprefetch-loop-arrays
> -fsched-critical-path-heuristic
> -fsched-dep-count-heuristic
> -fsched-group-heuristic
> -fsched-last-insn-heuristic
> -fsched-rank-heuristic
> -fsched-spec-insn-heuristic
> -fshow-column
> -fstrict-volatile-bitfields
> -ftree-forwprop
> -ftree-loop-if-convert
> -ftree-phiprop
> -ftree-pta
> -ftree-slp-vectorize
> -fvar-tracking-assignments
< -mfused-madd

以下是我机器上版本 4.6 到 4.8 的差异:

> -faggressive-loop-optimizations
> -fgnu-runtime
> -fgnu-unique
< -finline-functions-called-once
> -finline-atomics
> -fira-hoist-pressure
> -fsync-libcalls
> -ftree-coalesce-vars
< -fvect-cost-model
> -mfxsr
> -mlong-double-80

在我的机器上,GCC 在编译 C 时默认使用 80 个不同的选项!当你编译C++或在不同平台上编译时,选项也会改变。

不过没关系。您基本上可以忽略所有这些选项,只关注最重要的选项,即各种 -W 警告标志、-O 优化标志(它们实际上只是大量预选 -f 标志和一些 -m——在我的电脑上,-O2 启用了 63 个额外的标志!),以及 -g 调试数据标志。

当然还有基本标志,如 -std=-c-o-l-I

我的意思是,您真的需要知道 -fbranch-count-reg 的作用吗?不是真的。