我正尝试使用CMake将/std:c++17
编译器标志添加到VS2017。我使用的是“现代”的跨平台的方式至今:如何使用CMake在VS2017中启用/ std:C++ 17
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无影响。至于为C++ 17添加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
开关 - 无论是可能的用途这两种工作。)
见https://gitlab.kitware.com/cmake/cmake/issues/16482,这是工作正在进行中。 – Florian
更新:'CMAKE_CXX_STANDARD 17'现在可以在最新的CMake中使用,并将在CMake-3.10中着陆。 – Ela782