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

时间:2016-07-25 23:17:33

标签: c++ cmake

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

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

2 个答案:

答案 0 :(得分:16)

<强>解决方案

您可以使用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)

答案 1 :(得分:0)

<块引用>

我已经读到我应该使用 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 使其可覆盖。