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::optional
C++ 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
将我的评论转化为答案
CMake团队正在为VS2017工作(截至2017年7月,即将推出的CMake版本3.10):
这些标志似乎是相当新的开关(与此问题的日期相关):
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)对于CLang和GNU,支持被合并到2017年的主要源代码分支中,并且是CMake 3.8及以上版本的一部分:
tam*_*bre 17
高于3.10的CMake版本支持MSVC C++标准交换机,适用于比19.0.24215更新的MSVC版本.如果未满足任一版本要求,则它们不起作用.
唯一的便携式方法,确保您的程序与正确的C++标准模式下的Visual Studio编译的,是要求至少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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13685 次 |
最近记录: |