默认 gcc 编译器选项是 gcc 版本特定还是操作系统特定或两者兼而有之?

Posted

技术标签:

【中文标题】默认 gcc 编译器选项是 gcc 版本特定还是操作系统特定或两者兼而有之?【英文标题】:Are default gcc compiler options gcc version specific or OS specific or both? 【发布时间】:2016-07-07 14:51:03 【问题描述】:

我想知道默认的 gcc 编译器选项是否可以改变,如果可以的话,我可以期待不同的默认编译器选项。默认编译器选项是否因一个 gcc 版本而异(例如 gcc 4.6 -> gcc 4.8)或者它们总是相同?默认编译器选项是否因操作系统版本而异(例如 Ubuntu 12.04 -> 14.04)?

我希望默认编译器选项对于两个不同的操作系统(例如 Ubuntu 和 Debian)是不同的,对吧?

【问题讨论】:

Ubuntu 基于 Debian。 @Olaf ...但 Debian 摇滚 ;) 默认 gcc 选项基于 gcc 的编译方式。 两者,而且它们也是特定于构建的。但非特定于架构的选项的默认默认值通常不会因架构而异,并且不同编译器版本共享的大多数选项的默认默认值很少在编译器版本之间发生变化。 一个例子是,-fnostrength-reduce 不得不 用于解决 gcc 中的错误,因此几乎所有默认值都使用了。修复错误后,大多数发行版都放弃了该默认选项 【参考方案1】:

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

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 做了什么吗?不是真的。

【讨论】:

【参考方案2】:

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

【讨论】:

我读到的“如前所述”的问题不仅仅是 “默认选项会变化吗?” 正如 所建议的那样,我在哪里可以期待不同的编译器选项?” 我将问题的主旨解释为:“我如何确定每种情况下会发生什么?”所以,这就是我试图回复的方式:(a) 使用 Automake,然后 (b) 指定所有相关的内容,而不是依赖默认值。 现在,知道在每种情况下会发生什么。用户运行他们习惯使用的configure &amp;&amp; make 过程,您可以完全控制所发生的事情。 OP 要求 默认 gcc 编译器选项... automake 到底如何更改它们...? Automake 允许生成特定于环境的 Makefile,这些 Makefile 不依赖于任何默认值, 明确指定正确操作所需的每个编译器选项软件。我没有解决“字面”问题:那已经完成了。我试图回答这个问题的“明显目的”:why 被问到的明显原因。请随意投票。

以上是关于默认 gcc 编译器选项是 gcc 版本特定还是操作系统特定或两者兼而有之?的主要内容,如果未能解决你的问题,请参考以下文章

NGINX编译选项

GCC:程序不适用于编译选项 -O3

找出确切的 gcc 隐式选项

centos7.7安装高版本gcc7.5实践

centos7.7安装高版本gcc7.5实践

Gcc常用选项及编译过程