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

target_compile_options() for only C++ files?

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

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

解决方案

您可以使用 generator expressions:

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

备选

但在这种特殊情况下,更独立于平台的方法是使用您正在使用的 target_compile_features(). I'm not sure which compiler feature,因此以下只是一个示例:

target_compile_features(MyLib PUBLIC cxx_explicit_conversions)

I've read that I should CXX_FLAGS instead to only add those flags to C++ files, however this won't (automatically) propagate through cmake's packages system.

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

正如 RAM this option is available since v3.1. But judging by https://repology.org/project/cmake/versions 指出的那样,它已经得到广泛支持。

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