c++11 - 如何在 CMake 中激活 C++ 11?

标签 c++11 cmake

当我尝试运行 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/

相关文章:

cmake - 在 cmake 混合语言项目中使用 FORTRAN 链接器

c++ - CMake 不适用于 Google Protobuf

cmake - 与CMake交叉编译时如何确定主机操作系统?

带有符号链接(symbolic link)的 CMake 文件(安装文件 DESTINATION 目录)

c++ - 将 std::map 与 std::thread 一起使用的意外行为

c++ for range循环比递减循环更快

c++ - 在 C++ 中,如果大小必须在编译时确定,那么 std::array 的意义何在?

build - CMake项目中带有前缀的头文件

c++ - 在 C++ 的子类中重载枚举

c++ - 如何对列表执行 GroupBy Sum 查询?