CMAKE_CXX_STANDARD 对比 target_compile_features?

CMAKE_CXX_STANDARD vs target_compile_features?

我渴望将我们的项目升级到 C++20。我的 CMakeLists.txt 文件通常说

set (CMAKE_CXX_STANDARD 17)
set (CMAKE_CXX_STANDARD_REQUIRED ON)

但我觉得这不是正确的方法。什么是正确的方法?是这个吗:

target_compile_features(Foo PUBLIC cxx_std_20)

其中 Foo 是我的目标的名称(每个目标都相同?)如果我这样做,我是否会删除所有的 set (CMAKE_CXX_STANDARD*) 行?

同理,如果我有

target_compile_features(Foo PUBLIC cxx_std_20)
target_compile_features(Bar PUBLIC cxx_std_17)
target_link_libraries(Bar PUBLIC Foo)

这是否意味着在构建 Bar 时它会注意到它需要包含 Foo 中的 headers 并且 Foo 需要 cxx_std_20 cxx_std_20 包含 cxx_std_17Bar 将使用 C++20 构建?

更新的选择肯定是

target_compile_features(Foo PUBLIC cxx_std_20)

有了这个,您可以而且应该删除旧的 set(CMAKE_CXX_STANDARD*)

但是,如果您还想使用 set(CMAKE_CXX_EXTENSIONS OFF) 禁用编译器扩展,则新版本会出现问题。据我所知,新语法是不可能的,将它们结合起来也不起作用。

你问题的第二部分:是的,cmake 会识别依赖关系并在必要时将编译器置于 c++-20 模式。