如何在CMake中启用C++17

oipij1gg  于 2023-11-19  发布在  其他
关注(0)|答案(9)|浏览(1217)

我使用的是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.

wgeznvg7

wgeznvg71#

现代CMake为此提出了一个接口target_compile_features。文档在这里:要求语言标准
使用方法如下:
target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17)

brgchamk

brgchamk2#

您的方法是正确的,但它不适用于MSVC 3.10之前的CMake版本。
从CMake 3.9 文档:
对于没有标准级别概念的编译器(如MSVC),这没有任何影响。
简而言之,CMake还没有更新以适应添加到VC++ 2017的标准标志。
您必须检测是否使用了VC++ 2017(或更高版本),并自行添加相应的标志。
在CMake 3.10(及更高版本)中,此问题已在较新版本的VC++中得到修复。请参阅3.10文档。

qkf9rpyu

qkf9rpyu3#

在现代CMake中,我发现最好在目标级别而不是全局变量级别分配CXX标准,并使用内置属性(参见此处:https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html)来保持编译器不可知性。
例如:

set_target_properties(FooTarget PROPERTIES
            CXX_STANDARD 17
            CXX_EXTENSIONS OFF
            etc..
            )

字符串

dpiehjr4

dpiehjr44#

你可以为其他编译器保留set(CMAKE_CXX_STANDARD 17),比如Clang和GCC,但是对于Visual Studio来说,它毫无用处。
如果CMake仍然不支持,您可以对Visual Studio执行以下操作:

if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17")
endif(MSVC)

字符串

编辑:由于问题标题没有提到编译器,我补充一下,对于gccclang等类似编译器,这是启用C++17的命令:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")

yhuiod9q

yhuiod9q5#

使用vs2019

set(CMAKE_CXX_STANDARD 17)

字符串

kq0g1dla

kq0g1dla6#

CMake标志中的Bash命令行:

-DCMAKE_CXX_STANDARD=17 \
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
-DCMAKE_CXX_EXTENSIONS=OFF \

字符串

pepwfjgg

pepwfjgg7#

根据我的测试,下面的代码将使VS 2019选择/std:clatest,否则对于其他平台,它将把C版本设置为C++17。我已经用emscripten,raspbian和windows测试过了。

if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest")
else(MSVC)
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
endif(MSVC)

字符串

yshpjwxd

yshpjwxd8#

您还可以使用target_compile_options为Visual Studio 2019设置/std:c++latest标志

if (MSVC_VERSION GREATER_EQUAL "1900")
    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("/std:c++latest" _cpp_latest_flag_supported)
    if (_cpp_latest_flag_supported)
        target_compile_options(${TARGET_NAME} PRIVATE "/std:c++latest")
    endif()
endif()

字符串
${TARGET_NAME}替换为实际的目标名称。

rsaldnfx

rsaldnfx9#

我登陆这里寻找正确的标志,以使标准的c17与CMAKE。我不使用MSVS,但gcc。所以,我希望这帮助别人。
具体来说,我使用的是CMAKE v3.22.0和g
v 11.2.0。
通过在CMakeLists.txt文件中包含以下行,我得到了所需的选项-std=c++17

set(CMAKE_CXX_STANDARD 17 CACHE STRING "v")
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_EXTENSIONS OFF)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON) #Optional

字符串
如果省略了set(CMAKE_CXX_EXTENSIONS OFF),则使用-std=gnu++17!最后一行是可选的,但检查标志非常有用。

相关问题