2012-05-28 10 views
7

Ich bin in der Lage, eine einzige Datei mit gcc mit -std = C++ 0x Option zu kompilieren. Aber ich kann das nicht über Makefile machen. Hier sind die Reihe von Flaggen in meinem Make-Datei (die nach make beschwert sich über C++ 11 keywords):Makefile-Modifikation zur Unterstützung von 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 

Was bin ich?

bearbeiten: habe ich es auf die folgenden, aber ich bekomme immer noch Fehler kompilieren, die ich mit Befehlszeile gcc Aufruf nicht bekommen.

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

Sie wollen wahrscheinlich 'CFLAGS + = stuff', nicht 'CFLAGS = Zeug'. – Fanael

+1

Warum haben Sie mehrere CFLAGS? Warum nicht einfach "CFLAGS = -O3 -std = C++ 0x -pg -D_DEBUG -g -c -Wall"? – mfontanini

+0

Ich habe es in den folgenden geändert, aber ich bekomme immer noch Kompilierungsfehler, die ich nicht mit der Befehlszeile GCC-Aufruf erhalten. CXXFLAGS = -O3 -std = C++ 0x -pg -D_DEBUG -g -c -Wall – Ari

Antwort

12

Auf diese Weise Ihre Make-Datei alle Ihre CFLAGS verwenden:

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

Sie überschreiben sie mit jeder "CFLAGS = ..." Erklärung.

Darüber hinaus sollte es CXXFLAGS, nicht CFLAGS sein. CFLAGS ist für C-Anwendungen.

Wie @Florian Sowade sagte, könnten Sie CFLAGS += -O3 -std.... (oder CXXFLAGS ..) verwenden, so dass Benutzer ihre eigenen Flags beim Ausführen von make bereitstellen können.

+4

Wenn Sie 'CFLAGS + = ...' schreiben, kann der Benutzer seine eigenen CFLAGS mit 'CFLAGS =" ... "make' –

+0

@FlorianSowade groß, hinzugefügt, dass die Antwort;) – mfontanini

+0

Florian: das ist nicht wahr. Variablenzuweisungen in der Befehlszeile überschreiben Einstellungen im Makefile vollständig, sogar + = Stileinstellungen. Die beste (und portabelste) Möglichkeit, dies zu handhaben, besteht darin, für interne Flags eine andere Variable zu verwenden und 'CFLAGS' /' CXXFLAGS' für die Person zu belassen, die make aufruft. – MadScientist

3

Sie können es in mehreren Zeilen halten, aber Sie wahrscheinlich wollen hängen, nicht zu zuordnen:

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

Wo möchten Sie diesen Schlamassel gekommen? Dieses Makefile war falsch lange bevor Sie es für C++ 11 änderten.

Beginnen wir mit der ersten Zeile beginnen:

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

Sie den Befehl echo `uname -s`-`uname -m` ausgeführt wird und Sie werden sehen, ob keine Leerzeichen in ohnehin hat, so was ist der Punkt in der sed Befehl?

Vielleicht möchten Sie dies:

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

Dass nur zwei Prozesse läuft (uname und sed) nicht vier (zwei unames, Echo und sed)

Wenn Sie mit GNU es machen sollte

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

So wird es nur einmal ausgeführt.

CCC  = CC 

Was ist CC?

CCC  = g++ 

Oh, es spielt keine Rolle, Sie haben den Wert trotzdem ersetzt. Die herkömmliche Make-Variable für den Compiler C++ ist CXX

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

Wie andere haben darauf hingewiesen, setzen Sie CFLAGS, es dann anders, dann auf etwas anderes zu etwas gesetzt. Nur der letzte Wert wird beibehalten.

LFLAGS = -O 
LFLAGS = -pg -g 

Hier gilt das gleiche, und was ist LFLAGS? Meinst du LDFLAGS?

Eine gute Möglichkeit, Makefiles zu debuggen ist ein Ziel zu erstellen, aus den Variablen drucken Sie setzen, um zu überprüfen sie die Werte haben Sie erwarten:

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

Danke für die Antwort. Dies ist eine riesige Legacy-Code-Basis, und ich habe mich nicht wirklich darum gekümmert, das Makefile zu modifizieren, bis ich C++ 11 aktivieren musste. Ich habe das Problem mit dem Überschreiben von Flags behoben, wie in meiner Bearbeitung gezeigt. – Ari

Verwandte Themen