当我试图运行一个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.1引入了可以使用的CMAKE_CXX_STANDARD变量。如果你知道你总是有CMake 3.1或更高版本可用,你可以把它写在你的顶级CMakeLists.txt文件中,或者把它放在任何新目标定义之前:

set (CMAKE_CXX_STANDARD 11)

如果你需要支持旧版本的CMake(现在不太可能),这里有一个我想到的宏,你可以使用:

macro(use_cxx11)
  if (CMAKE_VERSION VERSION_LESS "3.1")
    if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
    endif ()
  else ()
    set (CMAKE_CXX_STANDARD 11)
  endif ()
endmacro(use_cxx11)

宏目前只支持GCC,但是将其扩展到其他编译器应该很简单。

然后,您可以在任何CMakeLists.txt文件的顶部编写use_cxx11(),该文件定义了使用c++ 11的目标。

针对macOS的clang用户的CMake issue #15943

如果你使用CMake和clang来瞄准macOS,有一个错误可以导致CMAKE_CXX_STANDARD特性根本不能工作(不添加任何编译器标志)。确保你做了以下其中一件事:

使用cmake_minimum_required来要求CMake 3.0或更高版本,或者 在项目命令之前,在CMakeLists.txt文件的顶部使用以下代码将策略CMP0025设置为NEW: 修复CMAKE_CXX_STANDARD在针对macOS时的行为。 if (POLICY CMP0025) 设置CMP0025 NEW endif ()

其他回答

这是启用c++ 11支持的另一种方式,

ADD_DEFINITIONS(
    -std=c++11 # Or -std=c++0x
    # Other flags
)

我遇到过只有这个方法有效而其他方法失败的例子。也许和最新版本的CMake有关。

CMake 3.1引入了可以使用的CMAKE_CXX_STANDARD变量。如果你知道你总是有CMake 3.1或更高版本可用,你可以把它写在你的顶级CMakeLists.txt文件中,或者把它放在任何新目标定义之前:

set (CMAKE_CXX_STANDARD 11)

如果你需要支持旧版本的CMake(现在不太可能),这里有一个我想到的宏,你可以使用:

macro(use_cxx11)
  if (CMAKE_VERSION VERSION_LESS "3.1")
    if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
    endif ()
  else ()
    set (CMAKE_CXX_STANDARD 11)
  endif ()
endmacro(use_cxx11)

宏目前只支持GCC,但是将其扩展到其他编译器应该很简单。

然后,您可以在任何CMakeLists.txt文件的顶部编写use_cxx11(),该文件定义了使用c++ 11的目标。

针对macOS的clang用户的CMake issue #15943

如果你使用CMake和clang来瞄准macOS,有一个错误可以导致CMAKE_CXX_STANDARD特性根本不能工作(不添加任何编译器标志)。确保你做了以下其中一件事:

使用cmake_minimum_required来要求CMake 3.0或更高版本,或者 在项目命令之前,在CMakeLists.txt文件的顶部使用以下代码将策略CMP0025设置为NEW: 修复CMAKE_CXX_STANDARD在针对macOS时的行为。 if (POLICY CMP0025) 设置CMP0025 NEW endif ()

我在用

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++版本。

OS X和Homebrew LLVM相关:

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

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

最简单的方法:

add_compile_options(化= c + + 11)