我使用的是VS 15.3,它支持集成的CMake 3.8。我如何在不为每个特定编译器编写标志的情况下针对C++17?我当前的全局设置不起作用:
# https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# expected behaviour
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest")
字符串
我希望CMake在生成VS解决方案文件时添加“/std:clastest”或等效项,但没有找到c17标志,导致编译器错误:
C1189 #error: class template optional is only available with C++17.
型
9条答案
按热度按时间wgeznvg71#
现代CMake为此提出了一个接口
target_compile_features
。文档在这里:要求语言标准使用方法如下:
target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17)
个brgchamk2#
您的方法是正确的,但它不适用于MSVC 3.10之前的CMake版本。
从CMake 3.9 文档:
对于没有标准级别概念的编译器(如MSVC),这没有任何影响。
简而言之,CMake还没有更新以适应添加到VC++ 2017的标准标志。
您必须检测是否使用了VC++ 2017(或更高版本),并自行添加相应的标志。
在CMake 3.10(及更高版本)中,此问题已在较新版本的VC++中得到修复。请参阅3.10文档。
qkf9rpyu3#
在现代CMake中,我发现最好在目标级别而不是全局变量级别分配CXX标准,并使用内置属性(参见此处:https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html)来保持编译器不可知性。
例如:
字符串
dpiehjr44#
你可以为其他编译器保留
set(CMAKE_CXX_STANDARD 17)
,比如Clang和GCC,但是对于Visual Studio来说,它毫无用处。如果CMake仍然不支持,您可以对Visual Studio执行以下操作:
字符串
编辑:由于问题标题没有提到编译器,我补充一下,对于gcc、clang等类似编译器,这是启用C++17的命令:
型
yhuiod9q5#
使用
vs2019
时字符串
kq0g1dla6#
CMake标志中的Bash命令行:
字符串
pepwfjgg7#
根据我的测试,下面的代码将使VS 2019选择/std:clatest,否则对于其他平台,它将把C版本设置为C++17。我已经用emscripten,raspbian和windows测试过了。
字符串
yshpjwxd8#
您还可以使用
target_compile_options
为Visual Studio 2019设置/std:c++latest
标志字符串
将
${TARGET_NAME}
替换为实际的目标名称。rsaldnfx9#
我登陆这里寻找正确的标志,以使标准的c17与CMAKE。我不使用MSVS,但gcc。所以,我希望这帮助别人。
具体来说,我使用的是CMAKE v3.22.0和g v 11.2.0。
通过在
CMakeLists.txt
文件中包含以下行,我得到了所需的选项-std=c++17
:字符串
如果省略了
set(CMAKE_CXX_EXTENSIONS OFF)
,则使用-std=gnu++17
!最后一行是可选的,但检查标志非常有用。