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