为了账号安全,请及时绑定邮箱和手机立即绑定

如何在CMake中激活C+11?

/ 猿问

如何在CMake中激活C+11?

C++
慕盖茨1488219 2019-07-22 14:46:39

如何在CMake中激活C+11?

当我试图运行CMake生成的makefile来编译我的程序时,我得到的错误是

C+98模式不支持基于循环的范围。

我试着添加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-9 ubuntu3)4.6.1

我也试过SET(CMAKE_CXX_FLAGS "-std=c++0x")也不起作用。

我不明白如何使用CMake激活C+11功能。


查看完整描述

3 回答

?
慕雪9262066

CMake 3.1介绍了CMAKE_CXX标准可以使用的变量。如果您知道CMake3.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,但将其扩展到其他编译器应该是直截了当的。

然后你可以写use_cxx11()在任何定义使用C+11的目标的CMakeLists.txt文件的顶部。

针对MacOS的clang用户的CMake问题#15943

如果您正在使用cmake和clang来锁定macos,则有一个虫虫会导致CMAKE_CXX_STANDARD特性不能工作(不添加任何编译器标志)。确保您做了以下工作之一:

  • 使用

    最低要求

    要求CMake 3.0或更高版本,或
  • 将CMakeLists.txt文件顶部的以下代码设置为New策略CMP 0025project指挥:

    # Fix behavior of CMAKE_CXX_STANDARD when targeting macOS.if (POLICY CMP0025)
      cmake_policy(SET CMP0025 NEW)endif ()


查看完整回答
反对 回复 2019-07-22
?
慕容3218556

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_STANDARDCXX_STANDARD_REQUIRED为了你的目标。

另见我更详细的回答.


查看完整回答
反对 回复 2019-07-22
?
噜噜哒

我在用

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++11g++ 4.6.1已经很老了。试着换个新的g++版本。


查看完整回答
反对 回复 2019-07-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信