针对不同语言的不同 INTERFACE 编译器选项

Posted

技术标签:

【中文标题】针对不同语言的不同 INTERFACE 编译器选项【英文标题】:different INTERFACE compiler options for different languages 【发布时间】:2022-01-21 15:27:53 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案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 - f*** 是对的。这个答案是正确的。单个目标没有编译语言(但它确实有链接器语言),只有源有。 @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" )

但这似乎是一个杂牌。

【讨论】:

是的,不要这样做。按照 f*** 的建议去做。

以上是关于针对不同语言的不同 INTERFACE 编译器选项的主要内容,如果未能解决你的问题,请参考以下文章

golang type 和断言 interface{}转换

Go -- type 和断言 interface{}转换

针对不同的 NODE_MODULE_VERSION 编译 - Tree-sitter 解析器,ATOM 包

java编译器源码分析之词法分析器

Xcode 项目:针对不同目标的不同语言

go面向对象之多态即接口(interface)