target_compile_options() 仅适用于 C++ 文件?

Posted

技术标签:

【中文标题】target_compile_options() 仅适用于 C++ 文件?【英文标题】:target_compile_options() for only C++ files? 【发布时间】:2016-07-25 23:17:33 【问题描述】:

是否可以将target_compile_options() 仅用于 C++ 文件?我想将它用于作为其他应用程序依赖项的目标,以便库可以将其编译器标志传播到这些应用程序。但是,如果与 C 或 ObjC 文件一起使用,某些标志(例如 -std=c++14)会导致构建失败。

我已经读到我应该 CXX_FLAGS 而不是只将这些标志添加到 C++ 文件中,但这不会(自动)通过 cmake 的包系统传播。

【问题讨论】:

IIRC CXX_FLAGS 可以通过库包由prefixing with that packages name 传播。 你说的CMake的包系统是什么意思? 【参考方案1】:

解决方案

您可以使用generator expressions:

target_compile_options(MyLib PUBLIC $<$<COMPILE_LANGUAGE:CXX>:-std=c++14>)

替代方案

但在这种特殊情况下,更独立于平台的方法是使用target_compile_features()。我不确定您使用的是哪个compiler feature,因此以下仅为示例:

target_compile_features(MyLib PUBLIC cxx_explicit_conversions)

【讨论】:

太好了,生成器表达式正是我所需要的,谢谢。 target_compile_features 确实看起来不错,尽管由于一些发行版,我们现在需要坚持使用 cmake v3.0。 target_compile_features 显然可用于直接按年份要求特定语言版本,而无需挑选该版本引入的特定功能:target_compile_features(someTargetName PUBLIC cxx_std_14) 请不要通过操纵编译器选项来设置 C++ 标准。由于 cmake 3.1 cmake 允许用户通过将CXX_STANDARD 属性设置为 11 来通过目标属性设置预期的编译器标准。 对我来说,在 CMake 3.12 上,这仅在 enable_language(CUDA) 出现在序言中时才有效。【参考方案2】:

我读过我应该 CXX_FLAGS 而不是只将这些标志添加到 C++ 文件中,但这不会(自动)通过 cmake 的包系统传播。

在 CMake 中,如果您使用任何以 target_* 为前缀的函数,则它仅具有一个构建目标的范围。如果您希望您的整个项目使用给定的标准构建,您可以使用set(CMAKE_CXX_STANDARD 14)。如果某些目标需要其他设置,您可以使用target 前缀函数和CXX_STANDARD 变量在本地覆盖它(默认值为$CMAKE_CXX_STANDARD)。

正如RAM 所指出的,此选项自 v3.1 起可用。但是从https://repology.org/project/cmake/versions来看,它已经得到了广泛的支持。

也经常有人指出,您不应该将 cpp 版本设置为固定。我还没有对此发表意见,但你可以,但你可以使用关键字 CACHED 使其可覆盖。

【讨论】:

以上是关于target_compile_options() 仅适用于 C++ 文件?的主要内容,如果未能解决你的问题,请参考以下文章

CMake:使用 target_compile_options 设置 ggc-min-expand 和 -heapsize

将 CMAKE_CXX_FLAGS 传递给 target_compile_options

CMake:使用target_compile_options设置ggc-min-expand和-heapsize

CMake中add_compile_options/target_compile_options的使用

CMake中add_compile_options/target_compile_options的使用

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