当我尝试运行 CMake 生成的 makefile 来编译我的程序时,出现错误
range based for loops are not supported in C++ 98 mode.
我尝试将 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-9ubuntu3) 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,但应该可以直接将其扩展到其他编译器。
然后,您可以在定义使用 C++11 的目标的任何 CMakeLists.txt 文件的顶部编写 use_cxx11()
。
面向 macOS 的 clang 用户的 CMake 问题 #15943
如果您使用 CMake 和 clang 来定位 macOS,则有 bug这可能会导致 CMAKE_CXX_STANDARD 功能根本无法工作(不添加任何编译器标志)。确保执行以下操作之一:
使用
cmake_minimum_required
需要 CMake 3.0 或更高版本,或者在 CMakeLists.txt 文件顶部的
project
命令之前使用以下代码将策略 CMP0025 设置为 NEW:# Fix behavior of CMAKE_CXX_STANDARD when targeting macOS. if (POLICY CMP0025) cmake_policy(SET CMP0025 NEW) endif ()
关于c++11 - 如何在 CMake 中激活 C++ 11?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10851247/