【问题标题】:different INTERFACE compiler options for different languages针对不同语言的不同 INTERFACE 编译器选项
【发布时间】:2021-09-01 16:17:32
【问题描述】:

从 v3.20 开始,CMake 具有 target_compile_options() command,我们可以调用它,例如:

target_compile_options(foo INTERFACE "--some-option")

这很好……只要我们只在单一语言的编译中使用 foo,甚至使用单一编译器。但是,如果我想在不同语言的编译中依赖 foo 怎么办?例如C、C++ 和 CUDA?

我怎样才能指出不同的编译选项供这些依赖者使用不同的语言?

【问题讨论】:

    标签: c++ cmake build cuda multilingual


    【解决方案1】:

    可能有一个适合你的生成器表达式:$<COMPILE_LANGUAGE:languages> (https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html#id2)

    不过,我还没有在你的场景中尝试过。

    target_compile_options(foo INTERFACE
        "$<$<COMPILE_LANGUAGE:C>:--option-for-C>"
        "$<$<COMPILE_LANGUAGE:CXX>:--option-for-C++>"
        ...
    )
    

    来自文档:

    $&lt;COMPILE_LANGUAGE:languages&gt;

    1 当用于编译单元的语言匹配languages 中的任何条目时,否则0。此表达式可用于指定编译选项、编译定义以及在目标中包含特定语言的源文件的目录。

    【讨论】:

    • 但是你确定这不是指foo的编译语言吗?
    • @einpoklum - fabian 是对的。这个答案是正确的。单个目标没有编译语言(但它确实有链接器语言),只有源有。
    • @AlexReinking:所以澄清一下,我之前评论的答案是“不,这些选项会在编译 foo 时添加每种语言?”
    • @einpoklum - 对。对于每个源文件,它将检查正在使用哪个编译器来生成目标文件并在该上下文中评估生成器表达式。 C 源代码将获得由$&lt;COMPILE_LANGUAGE:C&gt; 保护的标志,C++ 源将获得由$&lt;COMPILE_LANGUAGE:CXX&gt; 保护的标志,等等。
    【解决方案2】:

    我目前的想法是使用虚拟目标,每个目标都有自己的 INTERFACE 编译选项:

    add_custom_target( foo_c    )
    add_custom_target( foo_cpp  )
    add_custom_target( foo_cuda )
    add_dependencies( foo_c    foo )
    add_dependencies( foo_cpp  foo )
    add_dependencies( foo_cuda foo )
    target_compile_options( foo_c    INTERFACE "--option-for-C"    )
    target_compile_options( foo_cpp  INTERFACE "--option-for-C++"  )
    target_compile_options( foo_cuda INTERFACE "--option-for-CUDA" )
    

    但这似乎是一个杂牌。

    【讨论】:

    • 是的,不要这样做。按照 fabian 的建议去做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多