2016-11-03 2 views
-2

Das sollte also nicht annähernd so viel Mühe machen, aber ich versuche ein effizienteres Makefile mit Wildcard-Operatoren zu erstellen, im Gegensatz zu der langweiligen Methode, die ich benutzt habe, um jedes einzelne Objekt zu erstellen Datei und verknüpfen Sie sie dann miteinander. Aber aus welchem ​​Grund auch immer, Immer wenn ich versuche zu laufen ‚machen‘ es gibt mir dies:Mehrfachfunktionsdefinition Fehler Makefile?

multiple definition of 'ScreenMgr::ScreenMgr()' 
/path/to/ScrenMgr.cpp:4: first defined here 

dann auch es gibt mir einen anderen Fehler unmittelbar nach dieser eine, die sagt:

undefined reference to main 
collect2: error: ld returned 1 exit status 

Obwohl, bevor diese Fehler, meine .o werden produziert und in das richtige Verzeichnis platziert, so dass der Fehler mit dem Linker sein muss. Ich kann die C++ - Quelle einbeziehen, wenn jemand denkt, dass es hilft, aber die Dateien sind praktisch leer, obwohl ich immer noch Header-Wachen einfüge, weil ich nur sicherstellen wollte, dass alles zuerst richtig verlinkt, damit ich damit umgehen kann Probleme wie diese, ohne sich um den Code kümmern zu müssen. Die Verzeichnisstruktur wie folgt aussieht:

-MsSolver 
|--src 
| |--main.cpp 
| |--ScreenMgr.cpp 
|--include 
| |--ScreenMgr.h 
|--build #empty directory 
| 
|--Makefile 
|: 
|--bin 

und hier ist die Make-Datei:

+2

Ihr Problem ist nicht Ihr Makefile. Ihr Problem ist in ScreenMgr.cpp oder ScreenMgr.h –

+0

Sie haben wahrscheinlich einen richtigen Include-Guard in der Header-Datei. – Barmar

+0

Oder vielleicht definieren Sie den Konstruktor in '.cpp' und' .h'. – Barmar

Antwort

1
$(BUILDIR)/%.o: $(SRCS) 

Diese Zeile weist make, dass es jede .o-Datei von all der Quelldateien bauen .

$(CC) $(CFLAGS) -c $< -o [email protected] 

Und in dieser Linie, bedeutet die $<ersten Abhängigkeit, das heißt die erste Quelldatei in $(SRCS), d.h. src/ScreenMgr.cpp.

So machen im Wesentlichen das tun die Objektdateien zu erstellen:

$(CC) $(CCFLAGS) -c src/ScreenMgr.cpp -o build/ScreenMgr.o 
$(CC) $(CCFLAGS) -c src/ScreenMgr.cpp -o build/main.o 
$(CC) $(LFLAGS) $(INCLUDES) $(LIBS) build/ScreenMgr.o build/main.o -o bin/mssolver 

Basierend auf den Namen der .o Dateien, die Sie vielleicht denken, es funktioniert richtig ... aber es ist nicht, es ist eigentlich verbindet zwei " kopiert "von ScreenMgr.cpp und verbindet main.cpp nicht!

Ändern Sie es an:

$(BUILDDIR)/%.o: $(SRCDIR)/%.cpp 

statt.