如何在 CMake 中启用 C + + 17

我使用的是 VS15.3,它支持集成的 CMake 3.8。如何在不为每个特定编译器编写标志的情况下将 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")

I expected CMake to add "/std:c++lastest" or equivalents when generating VS solution files, but no c++17 flags was found, resulted in compiler error:

C1189 #error: class template optional is only available with C++17.
154889 次浏览

你可以为其他编译器保留这个 set(CMAKE_CXX_STANDARD 17),比如 Clang 和 GCC,但是对于 Visual Studio 来说,这是没有用的。

如果 CMake 仍然不支持这一点,您可以对 视觉工作室执行以下操作:

if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17")
endif(MSVC)

编辑: 由于问题标题没有提到编译器,让我补充一下,对于 GCCclang和类似的编译器,这是启用 C + + 17的命令:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")

您的方法是正确的,但是它在3.10之前的 CMake 版本上对 MSVC 不起作用。

来自 CMake < strong > < em > 3.9 文档:

对于没有标准级别概念的编译器(如 MSVC)来说,这没有任何效果。

简而言之,CMake 还没有更新以适应添加到 VC + + 2017的标准标志。

You have to detect if VC++ 2017 (or later) is used and add the corresponding flags yourself for now.


在 CMake 3.10(以及更高版本)中,这个问题已经在新版本的 VC + + 中得到了解决。

在现代 CMake 中,我发现最好是在目标级别而不是全局变量级别分配 CXX 标准,并使用内置属性(参见此处: https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html)来保持编译器的不可知性。

例如:

set_target_properties(FooTarget PROPERTIES
CXX_STANDARD 17
CXX_EXTENSIONS OFF
etc..
)

Modern CMake 为此提供了一个接口 target_compile_features。 文档在这里: < a href = “ https://cmak.org/cmake/help/best/Manual/cmake-coding-Features. 7.html #  璶-Language-standard”rel = “ noReferrer”> 《要求语言标准》

像这样使用它:

target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17)

You can also use target_compile_options to set /std:c++latest flag for Visual Studio 2019

if (MSVC_VERSION GREATER_EQUAL "1900")
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("/std:c++latest" _cpp_latest_flag_supported)
if (_cpp_latest_flag_supported)
target_compile_options(${TARGET_NAME} PRIVATE "/std:c++latest")
endif()
endif()

用实际的目标名称替换 ${TARGET_NAME}

当使用 vs2019

set(CMAKE_CXX_STANDARD 17)

根据我的测试,下面的代码将使 VS2019能够选择/std: c + + last,否则对于其他平台,它将把 C + + 版本设置为 C + + 17。我已经测试了这个脚本,拉斯普林斯和窗口。

if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest")
else(MSVC)
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
endif(MSVC)

Bash command line in CMake flags:

-DCMAKE_CXX_STANDARD=17 \
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
-DCMAKE_CXX_EXTENSIONS=OFF \