我正在使用支持集成 CMake 3.8 的 VS 15.3。如何在不为每个特定编译器编写标志的情况下以 C++17 为目标?我当前的全局设置不起作用:
# https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# expected behaviour
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest")
我希望 CMake 在生成 VS 解决方案文件时添加“/std:c++lastest”或等效项,但没有找到 c++17 标志,导致编译器错误:
C1189 #error: class template optional is only available with C++17.
原文由 MiP 发布,翻译遵循 CC BY-SA 4.0 许可协议
您的方法是正确的,但它不适用于 MSVC 在 3.10 之前的 CMake 版本上。
从 CMake 3.9 文档:
简而言之,CMake 尚未更新以适应添加到 VC++ 2017 的标准标志。
您现在必须检测是否使用了 VC++ 2017(或更高版本)并自己添加相应的标志。
在 CMake 3.10(及更高版本)中,此问题已针对较新版本的 VC++ 进行了修复。请参阅 3.10 文档。