【问题标题】:Pass compound compiler options using cmake使用 cmake 传递复合编译器选项
【发布时间】:2016-02-12 14:39:25
【问题描述】:

我正在尝试使用 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_CXX_FLAGSantipattern。在特定情况下,它看起来是正确的解决方案。
  • add_compile_options("-mllvm -XYZ;-mllvm -ABC") 不工作吗?
  • @arrowd no 这不起作用,因为它不会修剪引号 "" 所以它添加了例如clang++ .... "-mllvm -XYZ;-mllvm -ABC" 无效。

标签: c++ cmake clang llvm


【解决方案1】:

您在此处观察到的不是 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"。问题是 clang 将这些参数作为两个也就是说,clang 的main() 中的argv[i] 指向"-mllvm -XYZ" 字符串,clang 将其视为单个标志。

我能看到的唯一解决方案是使用CMAKE_{C,CXX}_FLAGS 来设置这些标志。正如@Tsyvarev 所说,使用这个变量是完全可以的。

【讨论】:

    猜你喜欢
    • 2017-11-01
    • 2021-10-10
    • 1970-01-01
    • 2023-04-08
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多