2010-05-25 1 views
100

Mein Projektverzeichnis wie folgt aussieht:Kann ich alle .cpp-Dateien in src/zu .o's in obj/kompilieren und dann zu binary in ./?

/project 
    Makefile 
    main 
    /src 
     main.cpp 
     foo.cpp 
     foo.h 
     bar.cpp 
     bar.h 
    /obj 
     main.o 
     foo.o 
     bar.o 

Was ich meine Make-Datei möchte zu tun wäre, alle .cpp Dateien im /src Ordner .o Dateien im /obj Ordner zu kompilieren, dann all verknüpfen .o Dateien in /obj in die Ausgabe-Binärdatei im obersten Ordner /project.

Ich habe fast keine Erfahrung mit Makefiles, und ich bin nicht wirklich sicher, was zu suchen, um dies zu erreichen.

Ist dies auch ein "guter" Weg, oder gibt es einen Standardansatz für das, was ich versuche?

+0

http://www.gnu.org/software/make/manual/make.html, Beispiel: http: // www.gnu.org/software/make/manual/make.html#Simple-Makefile – Anycorn

+6

@aaa: Ich vermute, das OP will eine Lösung, die nicht explizit jede Quelldatei auflisten muss. – Cascabel

+6

Ich möchte nicht jede Quelldatei angeben, die ich habe, und ich habe versucht, dieses Handbuch vorher zu lesen, aber ich finde es unorganisiert und schwer zu verstehen. Ich lerne viel besser von einem tatsächlichen Beispiel, das tut, was ich erwarte, und es wird gut erklärt, anstatt trockene technische Handbücher. –

Antwort

153

Makefile Teil der Frage

Dies ist sehr einfach, es sei denn, Sie müssen so etwas wie der Code nicht versuchen, verallgemeinern unten (aber Raum Vertiefung mit Registerkarten in der Nähe von g ++ ersetzen)

SRC_DIR := .../src 
OBJ_DIR := .../obj 
SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp) 
OBJ_FILES := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES)) 
LDFLAGS := ... 
CPPFLAGS := ... 
CXXFLAGS := ... 

main.exe: $(OBJ_FILES) 
    g++ $(LDFLAGS) -o [email protected] $^ 

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
    g++ $(CPPFLAGS) $(CXXFLAGS) -c -o [email protected] $< 

Automatische Abhängigkeitsgraphen Generation

Ein Muss für die meisten Systeme. Mit GCC in kann durch Zugabe von -MMD Flagge zu CXXFLAGS und -include $(OBJ_FILES:.o=.d) bis zum Ende des Makefiles Körpers in einem einzigen Durchgang als Nebenwirkung der Kompilierung durchgeführt werden:

CXXFLAGS += -MMD 
-include $(OBJ_FILES:.o=.d) 

Und wie Jungs bereits erwähnt, hat immer GNU Make Manual um , Es ist sehr hilfreich.

+11

Ah, du hast mich in Sekunden geschlagen. Aber ich schlage vor: OBJ_FILES = $ (patsubst src /%. Cpp, obj /%. O, $ (CPP_FILES)) '. – Beta

+1

Ich musste dies ändern, damit es funktioniert: '$ <' sollte '$ ^' für die Regel von main.exe sein und ich denke, es gibt einen Tippfehler mit 'obj /%. O: src /% cpp'. – oscode

+0

@oscode - warum Tippfehler? – bobah

4

Wildcard funktioniert auch für mich, aber ich würde gerne eine Randnotiz für diejenigen geben, die Verzeichnisvariablen verwenden. Verwenden Sie immer slash für Ordnerbaum (nicht umgekehrten Schrägstrich), sonst wird es fehlschlagen:

BASEDIR = ../.. 
SRCDIR = $(BASEDIR)/src 
INSTALLDIR = $(BASEDIR)/lib 

MODULES = $(wildcard $(SRCDIR)/*.cpp) 
OBJS = $(wildcard *.o) 
+0

meinst du Schrägstrich? Ihr Beispiel zeigt, was traditionell als Schrägstrich bezeichnet wird. Insbesondere diejenigen, die sich "nach rechts beugen", werden als "vorwärts" betrachtet, und diejenigen, die übrig sind, werden als "zurück" betrachtet. –

+0

Ja, richtig, ich meine nur "Schrägstrich". Ich habe den Beitrag aktualisiert. – xesf

Verwandte Themen