在 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
,则变量可以称为 CFLAGS
或 COPTS
并设置为
make CFLAGS=-O3
如果构建使用 shell 脚本,可能类似于
CFLAGS="-O3" ./configure
会起作用。没有看到构建就没有告诉。
如果我在同一个命令行中给出 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
,则变量可以称为 CFLAGS
或 COPTS
并设置为
make CFLAGS=-O3
如果构建使用 shell 脚本,可能类似于
CFLAGS="-O3" ./configure
会起作用。没有看到构建就没有告诉。