2016-06-21 11 views
1

Ich wollte lernen, wie man ein grundlegendes Makefile für mein Programm erstellt, das 3 Dateien enthält: a.cpp, b.cpp und b.h. Ich schließe b.h in a.cpp ein und rufe eine Funktion auf, die dort deklariert und in b.cpp definiert ist. Ich ging durch mehrere Makefile-Tutorials und kam wie dies mit einem Makefile up:Basic Makefile mit zwei .cpp-Dateien und eine Header-Datei

CC=g++ 
CFLAGS= -std=c++11 -Wall -pedantic -g 
SOURCES= a.cpp b.cpp 
DEPS= b.h 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=exec 

all: $(EXECUTABLE) 
    @echo Make has finished. 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(CFLAGS) $(OBJECTS) -o $(EXECUTABLE) 

%.o: %.cpp $(DEPS) 
    $(CC) $(CFLAGS) -c -o [email protected] $< 

clean: 
    $(RM) *.o *~ $(EXECUTABLE) 

Allerdings, wenn ich exec machen und führen Sie es wie beabsichtigt funktioniert nicht. Der Compiler gibt keine Warnungen oder Fehler, aber der Funktionsaufruf in a.cpp wird übersprungen, als ob er nicht da wäre. Wenn ich das einfache Programm starte, läuft mein Programm wie beabsichtigt. Offensichtlich mache ich in meinem Makefile nicht gerade etwas richtig, aber ich verstehe nicht was.

+1

Ich verstehe nicht, wie Sie ausführbar, wenn eine der Quelldateien ignoriert wird, wie Sie sagen. Sie sollten entweder einige Compiler/Linker-Fehler erhalten oder die Quelldatei hat keinen beobachtbaren Effekt, oder fehlt mir etwas Offensichtliches? – user463035818

+0

Alles, was mir einfällt, ist, dass vielleicht der Header verlinkt ist, aber die cpp ist irgendwie nicht. Die Existenz der Deklaration verhindert, dass sich der Compiler beschweren kann, aber die Funktion tut nichts, da ihre Definition nicht bekannt ist. –

Antwort

1

Wenn Sie Ihr Makefile-Beispiel lesen, ist es nützlich, es so zu lesen, wie es ein Computer tun würde, wenn Sie beim Durchlaufen der Datei Felder ersetzen. Die Zeilen, die für mich herauskamen waren:

SOURCES= a.cpp b.cpp 
... 
OBJECTS=$(SOURCES:.cpp=.o) 
... 
$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(CFLAGS) $(OBJECTS) -o $(EXECUTABLE) 
... 
%.o: %.cpp $(DEPS) 
    $(CC) $(CFLAGS) -c -o [email protected] $< 

Die erste Zeile definiert die Quelldateien. Die zweite definiert die Objektdateien (Erweiterung .o), die laut Makefile aus den .cpp-Dateien erstellt werden können. Die dritte und vierte definieren eine Regel zum Erstellen der endgültigen ausführbaren Datei, die erfordert, dass Ihre beiden Objektdateien a.o und b.o erfolgreich generiert werden. Die letzten beiden Zeilen definieren eine Regel für die Generierung der Objektdateien, die angibt, dass sie die gleichnamigen CPP-Dateien und die $(DEPS) == b.h Dateien benötigen.

Am Ende dieses Makefile ruft die folgenden Zeilen:

g++ -std=c++11 -Wall -pedantic -g -c -o a.o a.cpp b.h 
g++ -std=c++11 -Wall -pedantic -g -c -o b.o b.cpp b.h 
g++ -std=c++11 -Wall -pedantic -g a.o b.o -o exec 

So scheint es, dass der Bruch in Ihrem Code in den mixed-up Fahnen an den Compiler die ersten beiden Male vergangen ist.

1
CC=g++ 
CFLAGS= -std=c++11 -Wall -pedantic -g 
SOURCES= a.cpp b.cpp 
DEPS= b.h 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=exec 

all: $(EXECUTABLE) 
    @echo Make has finished. 

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

.cpp.o: 
    $(CC) $(CFLAGS) -c $*.cpp 

clean: 
    $(RM) *.o *~ $(EXECUTABLE)