使用 cmake 传递复合编译器选项
Pass compound compiler options using cmake
我正在尝试使用 cmake 的add_compile_options
将"复合"选项传递给编译器。
也就是说,涉及两个(或多个)标志的选项必须按特定顺序传递,并且即使它们已经传递给编译器,也不能省略任何标志。
一个例子是必须通过 clang 传递到 llvm 的所有 llvm 选项,例如 -mllvm -ABC -mllvm -XYZ -mllvm ...
。
我宁愿不使用CMake的反模式set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -ABC")
而是使用像check_cxx_compiler_flag(flag available)
+ add_compile_option(flag)
这样可移植的东西。
但是,add_compile_options(-mllvm -XYZ -mllvm -ABC)
失败,因为-mllvm
选项被缓存并且只传递一次,因此传递-mllvm -XYZ -ABC
会导致错误。
此外,使用引号 " 无济于事,因为引号也会被传递(即它们没有被剥离),这也会导致错误。
使用 CMake 传递这些选项的惯用方法是什么?
你在这里观察到的不是CMake保留引号。
CMake 有特殊类型的字符串 - 列表。列表是一个字符串,其中元素用 ";"
分隔。当你写somefunction(A B C)
时,你实际上是构造一个字符串"A;B;C"
,这也是一个包含 3 个元素的列表。但是当你写somefunction("A B C")
时,你传递的是一个普通的字符串。
现在,当你编写add_compile_options("-mllvm -XYZ;-mllvm -ABC")
时,CMake 确实纠正了事情(在某种意义上)——它传递编译器两个命令行参数,"-mllvm -XYZ
" 和 "-mllvm -ABC"
。问题是,叮当也把这些论点当作两个。也就是说,叮当main()
中的argv[i]
指向"-mllvm -XYZ"
弦,叮当将其视为单旗。
我能看到的唯一解决方案是使用 CMAKE_{C,CXX}_FLAGS
来设置这些标志。正如@Tsyvarev所说,使用此变量是完全可以的。
从 CMake 3.12 开始,您现在可以使用以下语法:
add_compile_options(
"SHELL:-mllvm -XYZ"
"SHELL:-mllvm -ABC"
)
这种可能性记录在这里:https://cmake.org/cmake/help/latest/command/target_compile_options.html#option-de-duplication
- Win32编译器选项和内存分配
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 基于编译器选项的编译二进制路径
- Qt5 用户界面编译器:-i 选项不可用
- 将"-01"替换为"-02" 英特尔编译器选项会导致 FPE 在较小的 for 循环行程计数中抛出
- 用于捕获未赋值的 r 值的编译器选项
- 暂时将C++项目(VS2015)移至Android操作系统.编译器选项?
- VS2017 C++编译器选项会影响矩阵乘法?
- Gradle with C++:如何更改编译器选项?
- qmake中添加了编译器选项的附加makefile目标
- 在编译器选项上定义字符串
- Clang编译器选项将异常规格LAX错误视为警告
- "-D__STDC_FORMAT_MACROS" GNU 编译器选项
- 不同的输出调用clang上的malloc应用编译器选项-00和-03
- 包括查找编译器选项的外部标头
- 从已编译的可执行文件中获取编译器选项
- Protogen vs. Protoc 编译器选项
- 是否有一组标准编译器选项
- 如何在 eclipse makefile 项目中的编译器选项中设置 -std=c++0x