当我试图运行一个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上实现这一点的建议,如果你受到限制的话。

其他回答

CMake命令target_compile_features()用于指定所需的c++特性cxx_range_for。然后,CMake将引入要使用的c++标准。

cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
add_executable(foobar main.cc)
target_compile_features(foobar PRIVATE cxx_range_for)

不需要使用add_definitions(-std=c++11)或修改CMake变量CMAKE_CXX_FLAGS,因为CMake将确保使用适当的命令行标志调用c++编译器。

也许你的c++程序使用了其他c++特性而不是cxx_range_for。CMake全局属性CMAKE_CXX_KNOWN_FEATURES列出了你可以选择的c++特性。

除了使用target_compile_features(),你还可以通过设置CMake属性显式地指定c++标准 CXX_STANDARD 而且 你的CMake目标的CXX_STANDARD_REQUIRED。

请参见我更详细的回答。

我想这两行就够了。

set(CMAKE_CXX_STANDARD 11)

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

OS X和Homebrew LLVM相关:

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

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

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

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

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

现代cmake提供了更简单的方法来配置编译器以使用特定版本的c++。所有人需要做的唯一一件事就是设置相关的目标属性。在cmake支持的属性中,用于确定如何配置编译器以支持特定版本的c++的属性如下:

CXX_STANDARD设置c++标准,它的特性被请求来构建目标。将此值设置为11,以目标c++ 11。 CXX_EXTENSIONS,一个布尔值,指定是否请求特定于编译器的扩展。将此设置为Off将禁用对任何特定于编译器的扩展的支持。

为了演示,这里有一个CMakeLists.txt的最小工作示例。

cmake_minimum_required(VERSION 3.1)

project(testproject LANGUAGES CXX )

set(testproject_SOURCES
    main.c++
    )

add_executable(testproject ${testproject_SOURCES})

set_target_properties(testproject
    PROPERTIES
    CXX_STANDARD 11
    CXX_EXTENSIONS off
    )