c++11 ¿Cómo activar C ++ 11 en CMake?
El comando CMake target_compile_features()
se usa para especificar la función de C ++ requerida cxx_range_for
. CMake entonces inducirá el estándar C ++ que se utilizará.
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 usar add_definitions(-std=c++11)
o modificar la variable CMake CMAKE_CXX_FLAGS
, porque CMake se asegurará de que el compilador de C ++ se invoque con los indicadores de línea de comando apropiados.
Tal vez su programa de C ++ use otras características de C ++ que cxx_range_for
. La propiedad global CMake CMAKE_CXX_KNOWN_FEATURES
enumera las características de C ++ que puede elegir.
En lugar de usar target_compile_features()
, también puede especificar el estándar de C ++ explícitamente estableciendo las propiedades de CMake CXX_STANDARD
y CXX_STANDARD_REQUIRED
para su destino de CMake.
Véase también mi respuesta más detallada .
Cuando intento ejecutar el makefile generado por CMake para compilar mi programa, aparece el error que
el rango basado en bucles no se admite en el modo C ++ 98.
Intenté 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 características de C ++ 11 usando CMake.
La forma más fácil de establecer el estándar Cxx es:
set_property(TARGET tgt PROPERTY CXX_STANDARD 11)
Vea la documentación de CMake para más detalles.
La forma más fácil:
add_compile_options(-std=c++11)
Lo que me funciona es establecer la siguiente línea en tu CMakeLists.txt:
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
Al establecer este comando, se activan las funciones de C ++ 11 para el compilador y, después de ejecutar el comando cmake ..
, debería poder usar el range based for loops
en su código y compilarlo sin ningún error.
Creo que solo estas dos líneas son suficientes.
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
Relacionados con OS X y Homebrew LLVM:
¡No olvides llamar a cmake_minimum_required (VERSION 3.3) y project () después de eso!
O CMake insertará project()
implícitamente antes de la línea 1, lo que causará problemas con la detección de la versión Clang y posiblemente otros tipos de problemas. Aquí hay un tema relacionado .