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