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

target_compile_options() for only C++ files?

本文关键字:适用于 C++ 文件 compile options target      更新时间:2023-10-16

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

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

解决方案

您可以使用生成器表达式:

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

替代

但在这种特殊情况下,更独立于平台的方法是使用target_compile_features()。我不确定你使用的是哪种编译器功能,所以下面只是一个例子:

target_compile_features(MyLib PUBLIC cxx_explicit_conversions)

我已经读到,我应该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使其可重写。