Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何启用/std:c++;2017年VS17与CMake合作_C++_Cmake_Visual Studio 2017_C++17 - Fatal编程技术网

C++ 如何启用/std:c++;2017年VS17与CMake合作

C++ 如何启用/std:c++;2017年VS17与CMake合作,c++,cmake,visual-studio-2017,c++17,C++,Cmake,Visual Studio 2017,C++17,我正在尝试使用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_fo

我正在尝试使用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:命令行警告D9025:用'/std:c++17'重写'/std:c++14'

我试过
set(CMAKE\u CXX\u标准17)
但它没有效果,事实上CMAKE文档提到
CMAKE\u CXX\u标准
对VS没有任何影响

至于在
target\u compile\u特性中添加一个C++17特性
,似乎还没有(即使在CMake-3.9.0-rc5中),即使有,我也只使用了C++17中的
std::optional
,对于
std::optional
等库特性,也没有
target\u compile\u特性
标志

所以我的问题是,用CMake做这件事最好(或最不难看)的方法是什么?在某种程度上,它也适用于gcc和clang?我很高兴使用最新的CMake版本(3.8或3.9)。我希望它是“好的”,而不是手动循环通过CXX\u COMPILE\u标志并删除字符串“/std:c++14”或类似的黑客行为

(编辑:它也可以是VS
/std:c++最新的开关,以可能的为准。两者都适用于此目的。)

将我的评论转换为答案

  • CMake团队正在为VS2017开发it(截至2017年7月,即将发布的CMake 3.10版):

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

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

    因此,对于VisualStudio,您必须“手动”替换或附加编译器开关,直到CMake正式支持它为止

    下面是我为
    std:c++latest
    测试的代码片段(例如在我的CMake 3.8.0版本中已受支持):

    if(MSVC版本大于等于“1900”)
    包括(检查CXXcompilerFlag)
    检查\u CXX\u编译器\u标志(“/std:c++最新版本”\u cpp\u最新版本\u标志\u受支持)
    如果(支持最新的cpp标志)
    添加编译选项(“/std:c++最新版本”)
    endif()
    endif()
    
  • 对于CLang和GNU,从2017年开始,支持被合并到主要源代码分支中,并且是CMake 3.8版及以上版本的一部分:


  • 对于更新于19.0.24215的MSVC版本,CMake版本高于3.10。如果其中任何一个版本要求没有得到满足,那么它们就没有任何效果

    唯一的可移植方法,以确保您的程序在VisualStudio中以正确的C++标准模式编译,至少需要CGASE 3.10,将目标属性设置为您希望的值,并在 < < /> > <代码> > 用法示例:

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

    请看,这是正在进行中的工作。更新:<代码> CMACHYCXXY标准17 现在可以在最晚的CKSK中登陆,并将在CMACH-3.10登陆。@ ELA7822已经过去了,你能考虑接受我的答案吗?因为我相信这是最新的答案。当时公认的答案是正确的。在这一特殊情况下,我倾向于同意你的意见,并改变公认的答案。@Florian?@Ela782有什么想法吗?你(提问者)稍后接受另一个答案是完全可以接受的。看,嗯!太糟糕了,它还没有登陆CMake,问题已经出现7个月了:-(这些标志并不太新,VS2015已经有了)。无论如何。鉴于我使用的是上述“现代”和基于目标的方法,手动替换/添加MSVC标志的最佳方法是什么?我想这将是一个令人头痛的问题。我无法
    获取\u target\u属性(my_compile_flags mylib compile_flags)
    因为它是一个接口目标(仅标题库)…我在一个新问题中问了这个问题:@Ela782添加了一个应该作为全局设置使用的代码段。只是不要将任何
    CMAKE_CXX_标准
    定义与之并行(以避免在生成的项目文件中发生冲突)有了
    add\u compile\u选项
    我们可以传递我们想要的任何东西,所以这实际上并不有趣。有没有一种方法可以通过便携式方式设置
    /std:c++latest
    ,例如
    CMAKE\u CXX\u标准
    ?有没有一种方法可以用它设置
    /std:c++latest
    ?米哈伊尔没有。人们的共识似乎是不添加
    latest
    值对于
    CXX\u标准
    ,而是分别支持每个标准版本。我创建了用于添加C++2a支持的功能。@Mikhail现在支持C++20。是否可以尝试一下?