【发布时间】:2017-07-07 00:24:15
【问题描述】:
我正在尝试使用 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++17 的 std::optional,并且没有 target_compile_features 标志用于库功能,如 std::optional。
所以我的问题是,用 CMake 做到这一点最好(或最不丑)的方法是什么?在某种程度上,它也适用于 gcc 和 clang?我很高兴使用最新的 CMake 版本(3.8 或 3.9)。我更喜欢它“不错”,而不是手动循环遍历 CXX_COMPILE_FLAGS 并删除字符串“/std:c++14”或类似的黑客攻击。
(编辑:它也可以是 VS/std:c++latest 开关——只要可能。两者都可以达到目的。)
【问题讨论】:
-
见gitlab.kitware.com/cmake/cmake/issues/16482,这是正在进行的工作。
-
更新:
CMAKE_CXX_STANDARD 17现在可以在最新的 CMake nightly 中使用,并将登陆 CMake-3.10。 -
@Ela782 随着时间的流逝,您是否可以考虑接受我的答案,因为我相信它是最新的。
-
@tambre 对此的 SO 政策是什么?当时接受的答案是正确的。在这种特殊情况下,我倾向于同意您的观点并更改已接受的答案。 @Florian 有什么想法吗?
-
@Ela782 您(提问者)稍后接受另一个答案是完全可以接受的。见here。
标签: c++ cmake visual-studio-2017 c++17