当我试图运行一个CMake生成的makefile来编译我的程序时,我得到的错误是

c++ 98模式不支持基于范围的for循环。

我尝试添加add_definitions(-std=c++0x)到我的CMakeLists.txt,但它没有帮助。

我也试过这个:

if(CMAKE_COMPILER_IS_GNUCXX)
    add_definitions(-std=gnu++0x)
endif()

当我执行g++——version时,我得到:

g+ (Ubuntu/Linaro 4.6.1- 9u阑尾3)4.6.1

我还尝试了SET(CMAKE_CXX_FLAGS "-std=c++0x"),这也不起作用。

我不明白如何使用CMake激活c++ 11特性。


当前回答

对于CMake 3.8和更新版本,您可以使用

target_compile_features(target PUBLIC cxx_std_11)

如果您希望在工具链不能遵循此标准的情况下生成步骤失败,则可以将此设置为必需的。

set_target_properties(target PROPERTIES CXX_STANDARD_REQUIRED ON)

如果你想严格遵守标准c++,即避免你的编译器提供的c++扩展(如GCC的-std=gnu++17),另外设置

set_target_properties(target PROPERTIES CXX_EXTENSIONS OFF)

这是在现代CMake介绍->添加功能-> c++ 11和超越详细文档。它还提供了关于如何在旧版本的CMake上实现这一点的建议,如果你受到限制的话。

其他回答

现代的方法是通过以下方式指定c++ 11所需的最低标准:

target_compile_features(foo PUBLIC cxx_std_11)

这种方式:

CMake can honor default C++ standard of the compiler if it's greater than C++11 You can clearly specify whether C++ standard is required at build time, consume time, or both. This is nice for libraries. Public compile features are propagated to downstream targets, so it comes for free in those targets even if they don't directly use this feature. Users can externally set another C++ standard (more recent basically), with CMAKE_CXX_STANDARD, either from command line or CMake presets. If you hardcode CMAKE_CXX_STANDARD in a CMakeLists, nobody can override the C++ standard without editing your CMakeLists, which is not very pleasant.

它需要CMake >= 3.8

你可以使用下面的方法。这将根据您的环境自动修改特性。

target_compile_features(your_target INTERFACE cxx_std_20)

例如,

在Gnu/Linux上添加-std= Gnu ++20 在Windows的Clang/Ninja上,它变成-std=c++20 在Windows MSVC上,它变成/std=c++20

所以你可以支持尽可能多的环境。

OS X和Homebrew LLVM相关:

不要忘记在它之后调用cmake_minimum_required(VERSION 3.3)和project() !

或者CMake将隐式地在第1行之前插入project(),导致Clang版本检测出现问题,并可能出现其他类型的问题。这是一个相关的问题。

事实证明,SET(CMAKE_CXX_FLAGS "-std=c++0x")确实激活了许多c++ 11特性。它不起作用的原因是这个语句看起来是这样的:

set(CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")

按照这种方法,-std=c++0x标志不知何故被覆盖,它不起作用。逐一设置标志或使用列表方法是有效的。

list( APPEND CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")

在现代CMake(>= 3.1)上,设置全局需求的最佳方法是:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

这句话的意思是:“我希望所有目标都使用c++ 11,这不是可选的,我不想使用任何GNU或微软扩展。” 在c++ 17中,我认为这仍然是最好的方法。

来源:在CMake中启用c++ 11及后续版本