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

Ela*_*782 30 c++ cmake c++17 visual-studio-2017

我正在尝试/std:c++17使用CMake 将编译器标志添加到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})
Run Code Online (Sandbox Code Playgroud)

这增加/std:c++14了VS2017(无论如何可能是默认值?).但是我无法将其切换到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无影响.

至于添加C++ 17功能target_compile_features,它似乎还没有(甚至在CMake-3.9.0-rc5中),即使有,我特别只使用std::optionalC++ 17 ,并没有target_compile_features像图书馆功能的标志std::optional.

所以我的问题是,使用CMake做到这一点的最好(或最不丑陋)的方法是什么?在某种程度上它也适用于gcc和clang?我很高兴使用最近的CMake版本(3.8或3.9).我更喜欢它是"好"而不是手动循环通过CXX_COMPILE_FLAGS并删除字符串"/ std:c ++ 14"或类似的一些黑客.

(编辑:它也可以是VS /std:c++latest开关 - 以可能的为准.两者都可以用于此目的.)

Flo*_*ian 21

将我的评论转化为答案

  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()
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于CLang和GNU,支持被合并到2017年的主要源代码分支中,并且是CMake 3.8及以上版本的一部分:

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


tam*_*bre 17

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

唯一的便携式方法,确保您的程序与正确的C++标准模式下的Visual Studio编译的,是要求至少CMake的3.10,目标属性设为CXX_STANDARD您所需的值,CXX_STANDARD_REQUIREDON.

用法示例:

set_property(TARGET my_target PROPERTY CXX_STANDARD 17)
set_property(TARGET my_target PROPERTY CXX_STANDARD_REQUIRED ON)
Run Code Online (Sandbox Code Playgroud)

  • @Mikhail对C++ 20的支持现在在[CMake nightlies](https://cmake.org/files/dev/?C=M;O=D)中.介意尝试? (4认同)