当我试图运行一个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特性。


当前回答

对我来说有用的是在你的CMakeLists.txt中设置以下行:

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

设置此命令将激活编译器的c++ 11特性,并且在执行cmake ..命令,您应该能够在代码中使用基于范围的for循环,并编译它而不会出现任何错误。

其他回答

如果你想总是激活最新的c++标准,这里是我对David Grayson的答案的扩展,根据最近(CMake 3.8和CMake 3.11)为CMAKE_CXX_STANDARD增加了17和20的值:

IF (CMAKE_VERSION VERSION_LESS "3.8")
    SET(CMAKE_CXX_STANDARD 14)
ELSEIF (CMAKE_VERSION VERSION_LESS "3.11")
    SET(CMAKE_CXX_STANDARD 17)
ELSE()
    SET(CMAKE_CXX_STANDARD 20)
ENDIF()

# Typically, you'll also want to turn off compiler-specific extensions:
SET(CMAKE_CXX_EXTENSIONS OFF)

(在链接答案中的set (CMAKE_CXX_STANDARD 11)中使用该代码。)

事实证明,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")

我想这两行就够了。

set(CMAKE_CXX_STANDARD 11)

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

在现代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及后续版本

我在用

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
        message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

但是如果你想要使用c++ 11, g++ 4.6.1已经相当老了。 尝试使用更新的g++版本。