如何使用 CMake 在 VS2017 中启用 /std:c++17
How to enable /std:c++17 in VS2017 with CMake
我正在尝试使用 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
开关 - 以可能者为准。两者都为此目的而工作。
将我的评论变成答案
-
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()
-
对于 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")
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么 C++17 中没有 std::construct_at?
- 字符转换功能 std::isupper() & std::islower() C++17
- C++17:使用 std::optional 来评估枚举是否包含值
- 在 Eclipse 上启用 C++17 以使用 'std::byte'
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- clang C++17 std::vector over align type 使用 -mavx 编译时元素 SIGSE
- 如何在 C++17 中检索 std::filesystem::file_time_type 的时钟类型
- 为什么 std::atomic 构造函数在 C++14 和 C++17 中的行为不同
- 为什么 'std::reference_wrapper' 在 c++17 中被弃用,而在 c++20 中被删除?
- 为什么 'std::unary_function' 仍然在 c++17 中编译?
- 从 std::set 中删除元素,同时在 C++17 中迭代该元素
- c++17通过生成预先声明的类型列表的笛卡尔乘积来生成std::变体
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- std::filesystem::directory_迭代器链接器问题(C++17)
- 在使用 -std=c++17 编译时在 GCC 中复活 std::auto_ptr
- 如何使用 CMake 在 VS2017 中启用 /std:c++17
- 致命错误:在 -std=c++17 的 clang 6.0 中找不到'charconv'文件
- clang-6 和 -std=c++17 -- 不能调用 bind(2)
- 请求C 17的编译器通过使用-STD 17标志在-STD = C 17时,将启用STD ::变体的支持