Cuando intento ejecutar un archivo MAKE generado por CMake para compilar mi programa, aparece el error que
el rango basado en bucles no se admite en el modo C ++ 98.
Traté de agregar add_definitions(-std=c++0x)
a mi CMakeLists.txt
, pero no me ayudó.
Intenté esto también:
if(CMAKE_COMPILER_IS_GNUCXX)
add_definitions(-std=gnu++0x)
endif()
Cuando lo hago g++ --version
, obtengo:
g ++ (Ubuntu / Linaro 4.6.1-9ubuntu3) 4.6.1
También lo he intentado SET(CMAKE_CXX_FLAGS "-std=c++0x")
, lo que tampoco funciona.
No entiendo cómo puedo activar las funciones de C ++ 11 usando CMake.
SET(CMAKE_CXX_FLAGS "-std=c++0x")
bien funciona para mí, por lo que es probablemente un problema en otro lugar en el archivo CMakeLists. Asegúrese de no sobrescribir accidentalmente el contenido de CMAKE_CXX_FLAGS más adelante.set(CMAKE_CXX_STANDARD 11)
(antes de definir el objetivo) es la mejor manera.CXX_STANDARD
lo hace no trabajo en MSVC, así que básicamente tiene que caer de nuevo atarget_compile_features
si quieres algo que funciona multiplataforma.Respuestas:
CMake 3.1 introdujo la variable CMAKE_CXX_STANDARD que puede usar. Si sabe que siempre tendrá CMake 3.1 disponible, puede escribir esto en su archivo CMakeLists.txt de nivel superior, o ponerlo justo antes de definir un nuevo objetivo:
Si necesita admitir versiones anteriores de CMake, aquí hay una macro que se me ocurrió que puede usar:
La macro solo es compatible con GCC en este momento, pero debería ser sencillo expandirla a otros compiladores.
Luego, podría escribir
use_cxx11()
en la parte superior de cualquier archivo CMakeLists.txt que defina un destino que use C ++ 11.CMake problema # 15943 para usuarios clang dirigidos a macOS
Si está utilizando CMake y clang para apuntar a macOS, hay un error que puede hacer que la
CMAKE_CXX_STANDARD
función simplemente no funcione (no agregue ningún indicador del compilador). Asegúrese de hacer una de las siguientes cosas:Establezca la política CMP0025 en NUEVO con el siguiente código en la parte superior de su archivo CMakeLists.txt antes del
project
comando:fuente
gnu++11
se aplica, incluso cuando se definen estas variablesset(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang)
set(CMAKE_ANDROID_STL_TYPE c++_static)
. Para mí, la única forma viable era el clásicoset (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
El comando CMake
target_compile_features()
se usa para especificar la función C ++ requeridacxx_range_for
. CMake inducirá el estándar C ++ que se utilizará.No es necesario usar
add_definitions(-std=c++11)
o modificar la variable CMakeCMAKE_CXX_FLAGS
, porque CMake se asegurará de que se invoque el compilador de C ++ con los indicadores de línea de comando apropiados.Tal vez su programa C ++ usa otras características de C ++ que
cxx_range_for
. La propiedad global CMakeCMAKE_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 C ++ explícitamente estableciendo las propiedades de CMakeCXX_STANDARD
yCXX_STANDARD_REQUIRED
para su objetivo CMake.Vea también mi respuesta más detallada .
fuente
estoy usando
Pero si quieres jugar
C++11
,g++ 4.6.1
es bastante viejo. Intenta obtener unag++
versión más nueva .fuente
CXX_STANDARD
respuestas basadas en, pero esta fue la única respuesta útil en mi situación.La forma más fácil de establecer el estándar Cxx es:
Consulte la documentación de CMake para más detalles.
fuente
set(CMAKE_CXX_STANDARD 11)
definir la propiedad predeterminada para todos los objetivos creados después de eso.set
comando sugerido por @emlai es global y afecta a todos los objetivos posteriores.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 declaración se veía así:Siguiendo este enfoque, de alguna manera
-std=c++0x
se sobrescribió la bandera y no funcionó. Establecer las banderas una por una o usar un método de lista está funcionando.fuente
CXX_STANDARD
propiedad es mejor ya que es independiente del compilador.La forma más fácil:
add_compile_options(-std=c++11)
fuente
Para CMake 3.8 y posteriores puedes usar
fuente
PUBLIC
aquí?PUBLIC
significa que otros objetivos que dependen de su objetivo también usarán C ++ 11. Por ejemplo, si su objetivo es una biblioteca, todos los objetivos que se vinculen con su bibliotecatarget_link_libraries
se compilarán con compatibilidad con C ++ 11.Esta es otra forma de habilitar el soporte de C ++ 11,
He encontrado casos en los que solo funciona este método y otros métodos fallan. Quizás tenga algo que ver con la última versión de CMake.
fuente
add_definitions
se supone que solo se usa para agregar DEFINICIONES, es decir, -D ALGO. Y como dijo @Emmanuel, en muchos casos no funciona.add_definitions
no estaba hecho para configurar banderas.En CMake moderno (> = 3.1), la mejor manera de establecer requisitos globales es:
Se traduce como "Quiero C ++ 11 para todos los objetivos, no es opcional, no quiero usar ninguna extensión de GNU o Microsoft". A partir de C ++ 17, esto sigue siendo en mi humilde opinión la mejor manera.
Fuente: Habilitación de C ++ 11 y posterior en CMake
fuente
Lo que funciona para mí es establecer la siguiente línea en su CMakeLists.txt:
Al configurar este comando, se activan las funciones de C ++ 11 para el compilador y, después de ejecutar el
cmake ..
comando, debe poder usarrange based for loops
su código y compilarlo sin ningún error.fuente
-std=c++11
, yaset (CMAKE_CXX_STANDARD 11)
que usará la bandera-std=gnu++11
, que podría ser indeseable.set (CMAKE_CXX_EXTENSIONS OFF)
Creo que solo estas dos líneas son suficientes.
fuente
target_compile_features
función Cmake , aplicada para cada objetivo individual, como se muestra en otras respuestas, es un enfoque más recomendado.En caso de que quiera activar siempre el último estándar de C ++, aquí está mi extensión de la respuesta de David Grayson , a la luz de las recientes (CMake 3.8 y CMake 3.11) adiciones de valores de 17 y 20 para CMAKE_CXX_STANDARD):
(Use ese código en lugar de
set (CMAKE_CXX_STANDARD 11)
en la respuesta vinculada).fuente
El cmake moderno ofrece formas más simples de configurar compiladores para usar una versión específica de C ++. Lo único que alguien debe hacer es establecer las propiedades de destino relevantes. Entre las propiedades compatibles con cmake , las que se utilizan para determinar cómo configurar compiladores para admitir una versión específica de C ++ son las siguientes:
CXX_STANDARD
establece el estándar C ++ cuyas características se solicitan para construir el objetivo. Establezca esto como11
objetivo C ++ 11.CXX_EXTENSIONS
, un valor booleano que especifica si se solicitan extensiones específicas del compilador. Establecer esto comoOff
deshabilita el soporte para cualquier extensión específica del compilador.Para demostrar, aquí hay un ejemplo mínimo de trabajo de a
CMakeLists.txt
.fuente
OS X y Homebrew LLVM relacionados:
¡No olvides llamar a cmake_minimum_required (VERSION 3.3) y project () después!
O CMake se insertará
project()
implícitamente antes de la línea 1, causando problemas con la detección de la versión de Clang y posiblemente otros tipos de problemas. Aquí hay un problema relacionado .fuente