如何使用 CMake 在 VS2017 中启用 /std:c++17

How to enable /std:c++17 in VS2017 with CMake

本文关键字:std c++17 启用 何使用 CMake VS2017      更新时间:2023-10-16

我正在尝试使用 CMake 将/std:c++17编译器标志添加到 VS2017 中。到目前为止,我正在使用"现代"跨平台方式:

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) # -std=c++11 instead of -std=gnu++11
set(MY_CXX_COMPILE_FEATURES cxx_generic_lambdas cxx_range_for cxx_strong_enums)
add_library(mylib INTERFACE)
target_compile_features(mylib INTERFACE ${MY_CXX_COMPILE_FEATURES})

这会在VS2017中添加/std:c++14(无论如何,这可能是默认值? 但是,我无法将其切换到 C++17(即让它添加/std:c++17(。如果我只是手动添加它,我会收到不太好的警告,因为两个标志都存在:

1>cl : Command line warning D9025: overriding '/std:c++14' with '/std:c++17'

我已经尝试过set(CMAKE_CXX_STANDARD 17)但它没有效果,事实上 CMake 文档提到CMAKE_CXX_STANDARD无论如何对 VS 都没有影响。

至于向target_compile_features添加 C++17 功能,似乎还没有(即使在 CMake-3.9.0-rc5 中(,即使有,我也专门只使用 C++17std::optional,并且没有像std::optional这样的库功能的target_compile_features标志。

所以我的问题是,使用 CMake 做到这一点的最佳(或最不丑陋(方法是什么?在某种程度上,它也适用于 gcc 和 clang?我很高兴使用最新的CMake版本(3.8或3.9(。我希望它"不错",而不是手动循环遍历CXX_COMPILE_FLAGS并删除字符串"/std:c++14"或类似的黑客。

(编辑:它也可以是VS/std:c++latest开关 - 以可能者为准。两者都为此目的而工作。

将我的评论变成答案

  1. CMake 团队正在为 VS2017 开发它(截至 2017 年 7 月,即将推出的 CMake 版本 3.10(:

    CMake:MSVC 标准版交换机

    这些标志似乎是相当新的开关(与这个问题的日期有关(:

    VS 2017 15.3 预览版现在支持/std:c++17

    因此,对于Visual Studio,您必须"手动"替换或附加编译器开关,直到CMake正式支持它。

    这是我测试std:c++latest的代码片段(例如在我的 CMake 3.8.0 版本中已经支持(:

    if (MSVC_VERSION GREATER_EQUAL "1900")
    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("/std:c++latest" _cpp_latest_flag_supported)
    if (_cpp_latest_flag_supported)
    add_compile_options("/std:c++latest")
    endif()
    endif()
    
  2. 对于 CLang 和 GNU,该支持已于 2017 年开始合并到主源代码分支中,并且是 CMake 3.8 及更高版本的一部分:

    CMake:功能:添加对C++ 17 种语言标准的支持

>高于 3.10 的 CMake 版本支持 MSVC C++标准交换机,适用于高于 19.0.24215 的 MSVC 版本。如果不满足任一版本要求,则它们不起作用。

确保在 Visual Studio 上使用正确的C++标准模式编译程序的唯一可移植方法是至少要求 CMake 3.10,将目标属性CXX_STANDARD设置为所需的值,CXX_STANDARD_REQUIRED设置为ON

用法示例:

set_property(TARGET my_target PROPERTY CXX_STANDARD 17)
set_property(TARGET my_target PROPERTY CXX_STANDARD_REQUIRED ON)

您可以将以下行添加到 CmakeLists.txt 文件中

set(GCC_COMPILE_FLAGS "${GCC_COMPILE_FLAGS} /std:c++17")