是否可以仅将target_compile_options()
用于C ++文件?我想将它用作目标,该目标用作其他应用程序的依赖项,以便库可以将其编译器标志传播到这些应用程序。但是,有一些标志,例如-std=c++14
,如果它们与C或ObjC文件一起使用,则会导致构建失败。
我已经知道我应该CXX_FLAGS
而只是将这些标志添加到C ++文件中,但这不会(通过cmake的软件包系统)自动传播。
答案 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 使其可覆盖。