fon*_*ini 5 c++ gcc cmake c++17
因此,回到 GCC 10.2(默认使用 C++14),我可以用它来告诉 CMake 我想要-std=gnu++17
:
target_compile_features(mytarget PRIVATE cxx_std_17)
set_target_properties(mytarget PROPERTIES
CXX_STANDARD_REQUIRED ON
)
Run Code Online (Sandbox Code Playgroud)
...这实际上是我不想要的,所以我曾经CXX_EXTENSIONS OFF
强迫-std=c++17
:
target_compile_features(mytarget PRIVATE cxx_std_17)
set_target_properties(mytarget PROPERTIES
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF # -std=c++17 instead of gnu++17
)
Run Code Online (Sandbox Code Playgroud)
输入海湾合作委员会 11.1。现在默认是 2017 版本的 ISO C++ 标准,因此上面的第一个代码片段不会为 GCC 生成任何 -std
标志,这与 GCC 11 的手册页兼容:
c++17
:2017 年 ISO C++ 标准及修订版。
gnu++17
: 的 GNU 方言-std=c++17
。这是 C++ 代码的默认设置。
问题是上面的第二个 CMake 片段也没有生成任何-std
flag。我现在该怎么做,这是 CMake 中的错误吗?我如何告诉它我想要一个显式-std=c++17
标志?
备注1:我知道我可以坚持-std=c++17
下去target_compile_options
,但我不想这样做,对吗?
备注 2:健全性检查:如果我更改cxx_std_17
为cxx_std_20
,则CXX_EXTENSIONS OFF
正确地从 切换-std=gnu++2a
为-std=c++2a
。
这个问题的答案是,这是 CMake 3.21 中的一个错误(但技术上不是 3.20,它比相关编译器更旧),将在 3.22 中修复,很可能通过以下合并请求来修复:https://gitlab。 kitware.com/cmake/cmake/-/merge_requests/6177