【发布时间】:2012-06-06 18:02:48
【问题描述】:
当我尝试运行 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-9ubuntu3) 4.6.1
我也试过SET(CMAKE_CXX_FLAGS "-std=c++0x"),还是不行。
我不明白如何使用 CMake 激活 C++ 11 功能。
【问题讨论】:
-
SET(CMAKE_CXX_FLAGS "-std=c++0x")对我来说很好用,所以 CMakeLists 文件中的其他地方可能存在问题。确保以后不会意外覆盖 CMAKE_CXX_FLAGS 的内容。 -
add_definitions(-std=c++11) 适用于 CMake 2.8.8
-
对于 CMake ≥3.1,
set(CMAKE_CXX_STANDARD 11)(在定义目标之前)是最好的方法。 -
@tuple_cat 你也可以基于目标来做。但请注意,
CXX_STANDARD不在 MSVC 上工作,所以基本上如果你想要跨平台工作的东西,你必须回退到target_compile_features。 -
关于 CMake 的问题在 SO 上很快就会过时 very。在 2020 年,您绝对不应该摆弄 CMakeLists.txt 中的编译器标志来执行此操作。如果您只想使用 C++11、14 等进行构建,请参阅MateuszL's answer。如果您还需要传播行为(即您的库的用户必须使用该 C++ 版本编译),请参阅eyelash's answer