在clang命令行中覆盖参数

时间:2015-12-15 11:25:50

标签: command-line clang

如果我在同一命令行中给clang -O3按顺序,-O2是否会覆盖-O2?后面的参数是否总是覆盖?
我无法在默认情况下更改的构建脚本添加{{1}},我只能在其后添加内容。这是可以接受的吗?

2 个答案:

答案 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,则可以将变量称为CFLAGSCOPTS,并使用

进行设置
make CFLAGS=-O3

如果构建使用shell脚本,可能类似

CFLAGS="-O3" ./configure

会奏效。没有看到构建,就没有任何意义。