2012-05-28 15 views
7

Sono in grado di compilare un singolo file utilizzando gcc con l'opzione -std = C++ 0x. Ma non posso farlo attraverso makefile. Ecco il set di bandiere nella mia makefile (che dopo il make si lamenta C++ 11 chiavi)Modifica makefile per supportare 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 

Che cosa mi manca?

Edit: ho cambiato in seguito, ma ho ancora ottenere errori di compilazione, che non ho ricevuto con la riga di comando gcc invocazione.

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

probabilmente avrete bisogno 'CFLAGS + = stuff', non 'CFLAGS = roba'. – Fanael

+1

Perché hai diversi CFLAG? Perché non solo "CFLAGS = -O3 -std = C++ 0x -pg -D_DEBUG -g -c -Wall"? – mfontanini

+0

L'ho modificato come segue, ma ricevo comunque errori di compilazione, che non ottengo con la chiamata a linea di comando gcc. CXXFLAGS = -O3 -std = C++ 0x -pg -D_DEBUG -g -c -Wall – Ari

risposta

12

questo modo il vostro makefile utilizzerà tutti i tuoi CFLAGS:

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

Li stai sovrascrivendo con ogni "CFLAGS = ..." dichiarazione.

Inoltre, dovrebbe essere CXXFLAGS, non CFLAGS. CFLAGS è per applicazioni C.

Come ha detto @Florian Sowade, è possibile utilizzare CFLAGS += -O3 -std.... (o CXXFLAGS ..), in modo che gli utenti possano fornire i propri contrassegni durante l'esecuzione di make.

+4

Se si scrive 'CFLAGS + = ...' l'utente può dare i propri CFLAG con 'CFLAGS =" ... "make' –

+0

@FlorianSowade great, ha aggiunto quello alla risposta;) – mfontanini

+0

Florian: non è vero. Le assegnazioni di variabili nella riga di comando sovrascrivono completamente le impostazioni nel makefile, anche + = le impostazioni di stile. Il modo migliore (e più portabile) per gestirli è usare una variabile diversa per i flag interni e lasciare 'CFLAGS' /' CXXFLAGS' per la persona che invoca make. – MadScientist

3

Si può tenerlo in più righe, ma probabilmente si desidera accodare, di non assegnare :

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

Dove hai preso quel casino da? Quel makefile era sbagliato molto prima di averlo modificato per C++ 11.

Cominciamo con la prima linea:

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

provare a eseguire il comando echo `uname -s`-`uname -m` e vedrete se non ha spazi in ogni caso, quindi qual è il punto nel comando sed?

Forse si vuole questo:

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

che corre solo due processi (uname e sed) non quattro (due unames, eco e SED)

Se stai usando GNU make dovrebbe essere

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

Quindi è eseguito una sola volta.

CCC  = CC 

Che cos'è CC?

CCC  = g++ 

Oh, non importa, hai comunque sostituito il valore. La variabile make convenzionale per il compilatore C++ è CXX

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

Come altri hanno fatto notare, è possibile impostare CFLAGS, quindi impostare a qualcosa di diverso, quindi a qualcosa di diverso. Verrà mantenuto solo l'ultimo valore.

LFLAGS = -O 
LFLAGS = -pg -g 

Stesso qui, e qual è LFLAGS? Intendi LDFLAGS?

Un buon modo per eseguire il debug makefiles è quello di creare un target per stampare le variabili si sta configurando, per controllare che hanno i valori che ci si aspetta:

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

Grazie per la risposta. Questa è un'enorme base di codice legacy, e non mi sono mai preoccupato di modificare il makefile fino ad ora che avevo bisogno di abilitare C++ 11. Ho risolto il problema con i flag di sovrascrittura, come mostrato nella mia modifica. – Ari