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_17
等 Bar
将使用 C++20 构建?
更新的选择肯定是
target_compile_features(Foo PUBLIC cxx_std_20)
有了这个,您可以而且应该删除旧的 set(CMAKE_CXX_STANDARD*)
。
但是,如果您还想使用 set(CMAKE_CXX_EXTENSIONS OFF)
禁用编译器扩展,则新版本会出现问题。据我所知,新语法是不可能的,将它们结合起来也不起作用。
你问题的第二部分:是的,cmake 会识别依赖关系并在必要时将编译器置于 c++-20
模式。
我渴望将我们的项目升级到 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_17
等 Bar
将使用 C++20 构建?
更新的选择肯定是
target_compile_features(Foo PUBLIC cxx_std_20)
有了这个,您可以而且应该删除旧的 set(CMAKE_CXX_STANDARD*)
。
但是,如果您还想使用 set(CMAKE_CXX_EXTENSIONS OFF)
禁用编译器扩展,则新版本会出现问题。据我所知,新语法是不可能的,将它们结合起来也不起作用。
你问题的第二部分:是的,cmake 会识别依赖关系并在必要时将编译器置于 c++-20
模式。