我很想将我们的项目升级到 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需要Foo和cxx_std_20包含cxx_std_20,cxx_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在必要时将编译器置于模式下。
| 归档时间: |
|
| 查看次数: |
7672 次 |
| 最近记录: |