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


当前回答

现代的方法是通过以下方式指定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

其他回答

我想这两行就够了。

set(CMAKE_CXX_STANDARD 11)

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

如果你想总是激活最新的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)中使用该代码。)

我在用

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

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。

请参见我更详细的回答。

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