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

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

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

【问题讨论】:

标签: c++ 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 使其可覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2021-04-18
    • 2016-04-20
    • 2014-12-09
    • 2023-03-14
    • 2015-10-09
    相关资源
    最近更新 更多