2012-05-28 14 views
7

Puedo compilar un solo archivo usando gcc con la opción -std = C++ 0x. Pero no puedo hacer esto a través de makefile. Éstos son el conjunto de banderas en mi makefile (que después se queja de maquillaje C++ 11) palabras clave:Modificación Makefile para admitir C++ 11

MACHINE = $(shell echo `uname -s`-`uname -m` | sed "s/ //g") 
CCC  = CC 
CCC  = g++ 
CFLAGS = -O3 
CFLAGS = -std=c++0x 
CFLAGS = -pg -D_DEBUG -g -c -Wall 
LFLAGS = -O 
LFLAGS = -pg -g 

¿Qué me falta?

Editar: me lo cambió a la siguiente, pero aún así obtener errores de compilación, que yo no se consigue con la línea de comandos de invocación gcc.

CXXFLAGS=-O3 -std=c++0x -pg -D_DEBUG -g -c -Wall 
+5

es probable que desee 'CFLAGS + = stuff', no 'CFLAGS = cosas'. – Fanael

+1

¿Por qué tiene varios CFLAGS? ¿Por qué no simplemente "CFLAGS = -O3 -std = C++ 0x -pg -D_DEBUG -g -c -Wall"? – mfontanini

+0

Lo cambié a lo siguiente, pero sigo teniendo errores de compilación, que no obtengo con la invocación de gcc en la línea de comando. CXXFLAGS = -O3 -std = C++ 0x -pg -D_DEBUG -g -c -Wall – Ari

Respuesta

12

De esta manera su makefile utilizará toda su CFLAGS:

CFLAGS=-O3 -std=c++0x -pg -D_DEBUG -g -c -Wall 

Los estás anulando con cada declaración de "CFLAGS = ...".

Además, debe ser CXXFLAGS, no CFLAGS. CFLAGS es para aplicaciones C.

Como dijo @Florian Sowade, podría usar CFLAGS += -O3 -std.... (o CXXFLAGS ..), para que los usuarios puedan proporcionar sus propios indicadores cuando ejecuten make.

+4

Si escribe 'CFLAGS + = ...' el usuario puede dar su propia CFLAGS con 'CFLAGS =" ... "make' –

+0

@FlorianSowade genial, agregó que a la respuesta;) – mfontanini

+0

Florian: eso no es cierto. Las asignaciones de variables en la línea de comando anulan las configuraciones en el archivo MAKE completamente, incluso + = configuraciones de estilo. La mejor (y más portátil) forma de manejar esto es usar una variable diferente para los indicadores internos y dejar 'CFLAGS' /' CXXFLAGS' para la persona que invoca make. – MadScientist

3

Puede mantenerlo en varias líneas, pero es probable que desee añadir , de no asignar :

# e.g. 
CFLAGS += -O3 
CFLAGS += -std=c++0x 
CFLAGS += -pg -D_DEBUG -g -c -Wall 
0

dónde sacaste ese lío de? Ese archivo MAKE estaba mal mucho antes de que lo modificaras para C++ 11.

Vamos a empezar con la primera línea:

MACHINE = $(shell echo `uname -s`-`uname -m` | sed "s/ //g") 

intente ejecutar el comando echo `uname -s`-`uname -m` y verá si no tiene espacios en cualquier caso, ¿cuál es el punto en el comando sed?

Tal vez usted quiere esto:

MACHINE = $(shell uname -s -m | sed "s/ /-/g") 

Eso sólo se ejecuta dos procesos (uname y SED) no cuatro (dos unames, eco y SED)

Si estás usando GNU make debería ser

MACHINE := $(shell uname -s -m | sed "s/ /-/g") 

Solo se ejecuta una vez.

CCC  = CC 

¿Qué es CC?

CCC  = g++ 

Oh, no importa, ha reemplazado el valor de todos modos. La variable maquillaje convencional para el compilador de C++ es CXX

CFLAGS = -O3 
CFLAGS = -std=c++0x 
CFLAGS = -pg -D_DEBUG -g -c -Wall 

Como otros han señalado, se establece CFLAGS, luego otra vez en algo diferente, entonces a algo diferente. Solo se mantendrá el último valor.

LFLAGS = -O 
LFLAGS = -pg -g 

Lo mismo aquí, y lo que es LFLAGS? ¿Quieres decir LDFLAGS?

Una buena forma de depurar los archivos make es crear un objetivo de imprimir las variables que está configurando, para comprobar que tienen los valores que se pueden esperar:

print-vars: 
     echo CFLAGS is $(CFLAGS) 
     echo LDFLAGS is $(LDFLAGS) 
+0

Gracias por la respuesta. Esta es una gran base de código heredado, y realmente no me molesté en modificar el archivo MAKE hasta ahora que necesitaba habilitar C++ 11. He solucionado el problema con sobreescribir indicadores como se muestra en mi edición. – Ari