CMAKE_CXX_STANDARD 与 target_compile_features?

Ben*_*Ben 14 c++ cmake c++20

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

set (CMAKE_CXX_STANDARD 17)
set (CMAKE_CXX_STANDARD_REQUIRED ON)
Run Code Online (Sandbox Code Playgroud)

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

target_compile_features(Foo PUBLIC cxx_std_20)
Run Code Online (Sandbox Code Playgroud)

我的目标的名称在哪里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)
Run Code Online (Sandbox Code Playgroud)

这是否意味着当它去构建时,Bar它会注意到它需要包含头文件,并且Foo需要Foocxx_std_20包含cxx_std_20cxx_std_17因此Bar将使用 C++20 构建?

小智 17

更新的替代方案肯定是

target_compile_features(Foo PUBLIC cxx_std_20)
Run Code Online (Sandbox Code Playgroud)

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

但是,如果您还想禁用set(CMAKE_CXX_EXTENSIONS OFF). 据我所知,新语法是不可能的,并且将它们结合起来也不起作用。

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

  • 为了完整起见,要禁用每个目标的编译器扩展,您可以执行“set_target_properties(Foo PROPERTIES CXX_EXTENSIONS OFF)”。 (2认同)
  • 您能谈谈设置“CMAKE_CXX_STANDARD”与“target_compile_features(... cxx_std_*)”的冲突程度吗? (2认同)