如果我在同一命令行中给clang -O3
按顺序,-O2
是否会覆盖-O2
?后面的参数是否总是覆盖?
我无法在默认情况下更改的构建脚本添加{{1}},我只能在其后添加内容。这是可以接受的吗?
答案 0 :(得分:7)
Clang驱动程序的操作在手册页Driver Design & Internals § Driver stages中描述。请注意如何使用-###
选项来转储每个阶段的结果。这不是您可以使用borken构建系统执行的操作,因为必须首先列出该选项。但是你可以验证驱动程序确实做了你希望它做的事情:
clang -### foo.cpp -O2 -O3 # dumps yayayada "-O3" yadamore
clang -### foo.cpp -O3 -O2 # dumps yayayada "-O2" yadamore
“yada”是我所省略的,因为它太多了。实际上,您指定的 last -O
选项是有效的选项。这是任何编译器驱动程序的预期行为。
答案 1 :(得分:5)
clang
从左到右处理选项。因此,最后-O
选项"胜出"。这是一个完全出于你问的原因:所以有可能覆盖其他人设置的默认值(例如一些构建系统,软件开发人员......)是的,这是完全可以接受的,而且你有很多好公司。
最终的参考是LLVM源代码(选项处理
由文件cl::ParseCommandLineOptions()
中的lib/Support/CommandLine.cpp
实施。)
开箱即用:即使你不能更改构建脚本,你也可以影响它来做你想做的事情。例如,优化选项可以是从选项或环境中获取的变量的一部分。例如,如果构建使用Makefile
,则可以将变量称为CFLAGS
或COPTS
,并使用
make CFLAGS=-O3
如果构建使用shell脚本,可能类似
CFLAGS="-O3" ./configure
会奏效。没有看到构建,就没有任何意义。