2013-06-04 22 views
6

Ich versuche, Makefile zu verwenden, um eine Reihe von .cpp Dateien in src/code/*.cpp sich zu kompilieren, kompilieren dann jede *.o in build/ und schließlich ausführbare erzeugen mit denen in build/ auch.Makefile: Kompilieren aus dem Verzeichnis in ein anderes Verzeichnis

Ich habe ein paar Antworten gelesen, mit denen ich versucht habe zu arbeiten, habe aber Probleme entdeckt, die ich nicht verstehe.

CC = g++ 
FLAGS = -g -c 

SOURCEDIR = /src/code 
BUILDDIR = build 

EXECUTABLE = DesktopSpecificController 
SOURCES = $(wildcard src/code/*.cpp) 
OBJECTS = $(patsubst src/code/*.cpp,build/%.o,$(SOURCES)) 

all: dir $(BUILDDIR)/$(EXECUTABLE) 

dir: 
    mkdir -p $(BUILDDIR) 

$(BUILDDIR)/$(EXECUTABLE): $(OBJECTS) 
    $(CC) $^ -o [email protected] 

$(OBJECTS): $(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp 
    $(CC) $(FLAGS) $< -o [email protected] 

clean: 
    rm -f $(BUILDDIR)/*o $(BUILDDIR)/$(EXECUTABLE) 

ich folgende Fehlermeldung zu tun bekommen, und ich bin nicht sicher, warum:

Makefile:19: target `src/code/main.cpp' doesn't match the target pattern 

ich auch sehen, dass, wenn die ausführbare Datei zu bauen versucht, es ist nicht die .o-Dateien verwenden, so dass es scheint meine Regel hier falsch zu sein.

+0

nur leicht meinen Makefile aktualisiert. – user1777907

Antwort

8

Ihre patsubst Funktion ist falsch; Sie können keine Shell-Platzhalterzeichen wie * verwenden. Sie wollen:

OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES)) 

Auch sollten Sie SOURCEDIR und BUILDDIR überall, nicht nur an einigen Stellen mit werden (sonst werden Sie Inkonsistenzen erhalten). Und schließlich Ihr SOURCEDIR Wert ist falsch: Es ist nicht mit / beginnen soll ich erwarten:

SOURCEDIR = src/code 

SOURCES = $(wildcard $(SOURCEDIR)/*.cpp) 
+0

Vielen Dank! Du hast mein Problem behoben, es funktioniert jetzt :) Vielen Dank! – user1777907

+1

Gern geschehen. Vergiss nicht, dass SO einer deiner letzten Orte sein sollte, nachdem du versucht hast, es selbst auszuarbeiten. Hier sind ein paar Makefile-Debugging-Tipps: Erstens, die Option "-p" druckt die gesamte make-Datenbank aus, einschließlich aller Werte aller Variablen. In GNU make können Sie auch die Funktion '$ (info ...)' verwenden, um Informationen wie Variablenwerte auszudrucken. Das Drucken dieser Werte hätte Ihnen einen guten Anhaltspunkt dafür gegeben, wo das Problem lag. – MadScientist

+2

Um MadScientists Vorschlag zu verdeutlichen, kann '$ (info ...)' beispielsweise als '$ (info $ (SOURCES))' 'verwendet werden. Es kann unmittelbar nach der Definition der interessierenden Variable eingefügt werden. –

Verwandte Themen