一尘不染

如果传递冲突的编译器标志,GCC的行为如何?

linux

我知道如果您这样执行GCC:

gcc -O3 -O2 foo.c

GCC将使用最后一次传递的优化标志(在本例中为O2)。但是,对所有标志都是这样吗?例如,如果我像这样执行GCC:

gcc -mno-sse -msse bar.c

它会支持SSE,因为那是传递的最后一个标志,还是会导致未定义的行为?我的初步实验似乎表明它将支持SSE,但是我不确定在所有情况下是否都适用。


阅读 263

收藏
2020-06-03

共1个答案

一尘不染

正如您在第一个示例中提到的那样,通常情况下,行上的更高选项会覆盖先前传递的选项。我个人没有遇到过任何不同的行为-m-f标志,但是我不知道文档中的特定参考。

请注意,某些选项的行为不这样:

$ gcc example.c -DABC -DABC=12
<command-line>: warning: "ABC" redefined
<command-line>: warning: this is the location of the previous definition

因此,-UABC在两者之间必须存在一个中间位置以关闭该警告。

clang顺便说一句,它特别擅长解决此问题-如果忽略命令行选项,它将发出警告,这可以为您提供帮助。

2020-06-03