在 clang 命令行中覆盖参数

Overriding arguments in clang command line

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

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 选项是有效的。这是任何编译器驱动程序的预期行为。

clang 从左到右处理选项。因此,最后一个 -O 选项 "wins"。这正是您要求的原因的功能:因此有可能覆盖其他人设置的默认值(例如某些构建系统,软件开发人员......)是的,这是完全可以接受的,而且你有很多好公司.

最终参考将是 LLVM 源代码(选项处理 由 cl::ParseCommandLineOptions() 在文件 lib/Support/CommandLine.cpp 中实现。)

跳出框框思考:即使您不能更改 构建脚本,您也可以影响 它做您想做的事。例如,优化选项可能是从选项或环境中获取的变量的一部分。例如,如果构建使用 Makefile,则变量可以称为 CFLAGSCOPTS 并设置为

make CFLAGS=-O3

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

CFLAGS="-O3" ./configure

会起作用。没有看到构建就没有告诉。