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

时间:2016-07-07 14:51:04

标签: c ubuntu gcc default-value compiler-flags

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

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

2 个答案:

答案 0 :(得分:3)

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

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优化标志(这实际上只是大量预选{{1}的快捷方式标志和一些-f - 在我的计算机上,-m启用了63个额外的标志!)和-O2调试数据标志。

当然还有基本的标记,例如-g-std=-c-o-l等。

我的意思是,你真的需要知道-I的作用吗?不是真的。

答案 1 :(得分:0)

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