C++ 如何启用/std:c++;2017年VS17与CMake合作
我正在尝试使用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
/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。是否可以尝试一下?