2012-05-28 13 views
7

Jestem w stanie skompilować pojedynczy plik przy użyciu gcc z opcją -std = C++ 0x. Ale nie mogę tego zrobić przez makefile. Oto zestaw flag w moim pliku makefile (który po reklamacji dotyczy słów kluczowych w języku C++ 11):Modyfikacja pliku Makefile w celu obsługi 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 

Czego mi brakuje?

Edit: Zmieniłem go do dalszej części, ale ja wciąż kompilacji błędy, które nie dostanę z wiersza poleceń gcc pw.

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

Prawdopodobnie chcesz 'CFLAGS + = stuff', nie 'CFLAGS = stuff'. – Fanael

+1

Dlaczego masz kilka CFLAGS? Dlaczego nie po prostu "CFLAGS = -O3 -std = C++ 0x -pg -D_DEBUG -g -c -Wall"? – mfontanini

+0

Zmieniłem go na następujący, ale nadal dostaję błędy kompilacji, których nie otrzymuję z wywołaniem gcc wiersza poleceń. CXXFLAGS = -O3 -std = C++ 0x -pg -D_DEBUG -g -c -Wall – Ari

Odpowiedz

12

ten sposób Państwa makefile użyje wszystkich swoich CFLAGS:

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

Ty przesłanianie je z każdym "CFLAGS = ..." deklaracji.

Co więcej, powinno być CXXFLAGS, a nie CFLAGS. CFLAGS jest dla aplikacji C.

Jako @Florian Sowade powiedział, możesz użyć CFLAGS += -O3 -std.... (lub CXXFLAGS ..), aby użytkownicy mogli dostarczyć własne flagi podczas wykonywania make.

+4

Jeśli napiszesz 'CFLAGS + = ...' użytkownik może dać własne CFLAGS z 'CFLAGS =" ... "make' –

+0

@FlorianSowade świetny, dodał, że do odpowiedzi;) – mfontanini

+0

Florian: to nie jest prawda. Przypisania zmiennych w wierszu poleceń całkowicie zastępują ustawienia w pliku Makefile, a nawet ustawienia + = style. Najlepszym (i najbardziej przenośnym) sposobem radzenia sobie z tym jest użycie innej zmiennej dla flag wewnętrznych i pozostawienie 'CFLAGS' /' CXXFLAGS' dla osoby wywołującej make. – MadScientist

3

można trzymać go w wielu wierszach, ale prawdopodobnie chcesz dołączyć, nie przypisać:

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

Skąd masz ten bałagan z? Ten plik Makefile był błędny na długo przed zmodyfikowaniem go dla C++ 11.

Zacznijmy od pierwszej linii:

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

Spróbuj uruchomić polecenie echo `uname -s`-`uname -m` a zobaczysz, jeśli nie ma miejsca w każdym razie, więc o co chodzi w poleceniu sed?

Może chcesz to:

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

który działa tylko dwa procesy (uname i SED) nie cztery (dwa unames Echo i SED)

Jeśli używasz GNU make powinno być

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

Wykonuje się tylko raz.

CCC  = CC 

Co to jest CC?

CCC  = g++ 

Och, to nie ma znaczenia, i tak zastąpiłeś tę wartość. make konwencjonalny zmienna dla kompilatora C++ jest CXX

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

Jak inni zwrócili uwagę, ustawienie CFLAGS, a następnie ustawić go na coś innego, to na coś innego. Zostanie zachowana tylko ostatnia wartość.

LFLAGS = -O 
LFLAGS = -pg -g 

To samo tutaj i co to jest LFLAGS? Czy masz na myśli LDFLAGS?

Dobrym sposobem na debugowanie Makefile jest stworzenie celu wydrukowania zmiennych ustawiania, aby sprawdzić, że mają wartości można oczekiwać:

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

Dzięki za odpowiedź. Jest to ogromna baza kodu starszego typu i naprawdę nie zawracałem sobie głowy modyfikowaniem pliku Makefile aż do teraz, gdy potrzebowałem włączyć C++ 11. Naprawiłem problem z nadpisywaniem flag, jak pokazano w mojej edycji. – Ari

Powiązane problemy