¿Cómo activar C ++ 11 en CMake?

Cuando trato de ejecutar CMake generado makefile para comstackr mi progtwig, obtengo el error que

el rango basado en bucles no es compatible con el modo C ++ 98.

Traté de agregar add_definitions(-std=c++0x) a mi CMakeLists.txt , pero no ayudó. Intenté esto también:

 if(CMAKE_COMPILER_IS_GNUCXX) add_definitions(-std=gnu++0x) endif() 

Cuando hago g++ --version , obtengo:

g ++ (Ubuntu / Linaro 4.6.1-9ubuntu3) 4.6.1

También probé SET(CMAKE_CXX_FLAGS "-std=c++0x") , que tampoco funciona.

No entiendo cómo puedo activar las funciones de C ++ 11 usando CMake.

CMake 3.1 introdujo la variable CMAKE_CXX_STANDARD que puede usar. Si sabe que siempre tendrá CMake 3.1 disponible, puede simplemente escribir esto en su archivo CMakeLists.txt de nivel superior o ponerlo justo antes de definir un nuevo objective:

 set (CMAKE_CXX_STANDARD 11) 

Si necesita soportar versiones anteriores de CMake, aquí hay una macro que se me ocurrió que puede usar:

 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) 

La macro solo es compatible con GCC en este momento, pero debería ser sencillo expandirla a otros comstackdores.

Luego podría escribir use_cxx11() en la parte superior de cualquier archivo CMakeLists.txt que defina un destino que use C ++ 11.

CMake issue # 15943 para usuarios clang que apuntan a macOS

Si está utilizando CMake y clang para apuntar a MacOS, hay un error que puede hacer que la característica CMAKE_CXX_STANDARD simplemente no funcione (no agregue ningún indicador de comstackción). Asegúrese de hacer una de las siguientes cosas:

  • Use cmake_minimum_required para requerir CMake 3.0 o posterior, o
  • Establezca la política CMP0025 en NUEVO con el siguiente código en la parte superior de su archivo CMakeLists.txt antes del comando del project :

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

El comando CMake target_compile_features() se usa para especificar la característica requerida de C ++ cxx_range_for . CMake inducirá el uso del estándar 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) 

No es necesario utilizar add_definitions(-std=c++11) o modificar la variable CMake CMAKE_CXX_FLAGS , porque CMake se asegurará de que el comstackdor C ++ se invoque con los indicadores de línea de comando apropiados.

Tal vez su progtwig C ++ utiliza otras características de C ++ que cxx_range_for . La propiedad global de CMake CMAKE_CXX_KNOWN_FEATURES enumera las características de C ++ que puede elegir.

En lugar de utilizar target_compile_features() también puede especificar explícitamente el estándar C ++ configurando las propiedades CMake CXX_STANDARD y CXX_STANDARD_REQUIRED para su destino CMake.

Ver también mi respuesta más detallada .

estoy usando

 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() 

Pero si quieres jugar con C++11 , g++ 4.6.1 es bastante viejo. Intenta obtener una versión más nueva de g++ .

La forma más fácil de establecer el estándar cxx es

  set_property(TARGET tgt PROPERTY CXX_STANDARD 11) 

Ver cmake doc para más detalles.

Como resultado, SET(CMAKE_CXX_FLAGS "-std=c++0x") activa muchas características de C ++ 11. La razón por la que no funcionó fue porque la statement se veía así:

 set(CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs") 

Siguiendo este enfoque, de alguna manera la -std=c++0x fue sobrescrita y no funcionó. Establecer los indicadores uno por uno o usar un método de lista está funcionando.

 list( APPEND CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs") 

La forma más fácil:

add_compile_options(-std=c++11)

Esta es otra forma de habilitar el soporte de C ++ 11,

 ADD_DEFINITIONS( -std=c++11 # Or -std=c++0x # Other flags ) 

He encontrado instancias donde solo funciona este método y otros métodos fallan. Tal vez tiene algo que ver con la última versión de CMake.

Lo que funciona para mí es establecer la siguiente línea en su CMakeLists.txt:

 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

Al establecer este comando se activan las características de C ++ 11 para el comstackdor y después de ejecutar el comando cmake .. , usted debería poder usar el range based for loops en su código y comstackrlo sin ningún error.

Para CMake 3.8 y posterior, puede usar

 target_compile_features(target PUBLIC cxx_std_11) 

Creo que estas dos líneas son suficientes.

 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

OSX y relacionados con LLVM caseros:

¡No olvide llamar a cmake_minimum_required (VERSIÓN 3.3) y project () después de esto!

O bien, cmake insertará el proyecto () implícitamente antes de la línea 1, causando problemas con la detección de la versión clang y posiblemente otros tipos de problemas. Aquí hay un problema relacionado