Ich habe auch meine Lösungen zum Versuch 7 hochgeladen.
Vielleicht hilft dir das weiter, allerdings habe ich in meiner
Makefile Pattern verwendet.
Aber ich versuch es auch nochmal zu erklären. Erstmal etwas über den Compiler:
Code: Alles auswählen
FLAGS = -O0 -g3 -Wall -fmessage-length=0
-g3 steht für "maximale" Debugging-Informationen
-Wall steht für alle Fehler und Warnungen anzeigen
-fmessage-length=0 weist den Compiler an, keinen zeilenumbruch bei seiner diagnostischen Ausgabe (zB Fehler) zu machen
Code: Alles auswählen
g++ $(FLAGS) -c -o obj/main.o src/main.cpp
-c bedeutet, dass nur die Objektdatei erstellt werden soll ohne dass diese bereits gelinkt wird.
-o legt die Output-Datei fest
und die nachfolgende Datei ist die Source-Datei.
Mit -I (großes i) kann man noch zusätzliche Include-Ordner angeben
mit -L Library-Ordner und
mit -l (kleines L) den Namen(!) (nicht der Dateiname) der statischen Bibliothek, wobei libABCD.a der Dateiname für eine Library namens ABCD ist.
Mit
Code: Alles auswählen
ar -r <Dateiname der Bibliothek> <Objektdateien>
Soweit zum Compiler ...
Nun zur eigentlich Makefile:
Wenn man bei eclipse ein C++ Makefile Projekt ausgewählt hat und dann auf Build klickt, wird von eclipse eigentlich nur "make -f makefile all" aufgerufen.
Das ist Quasi-Standard und ist auch der Grund dafür, dass man bei makefiles mit (dem Ziel/Target) "all" anfängt.
Alles was nach dem "all:" steht sind die Abhängigkeiten die "all" hat. Das sind für gewöhnlich alle Objekte des Projekts, also $(OBJS) wenn OBJS die Variable mit allen mit Leerzeichen getrennten Objekten ist.
zB:
Code: Alles auswählen
OBJS= obj/klasse1.o obj/klasse2.o obj/main.o
all: $(OBJS)
<tab>(Anweisungen)
Dafür sucht es in dem Makefile nach dem gleichnamigen Ziel und findet dann zB einen eintrag wie
Code: Alles auswählen
obj/klasse1.o: src/klasse1.cpp
<tab>g++ .....
Das ganze passiert für jedes Objekt, deswegen muss auch für jedes Objekt ein Eintrag vorhanden sein (außer man benutzt Pattern).
Eigentlich ist die Struktur einer Makefile nicht schwer, nur die Compiler Anweisungen können verwirrend sein.
So, ich hoffe ich habe nichts wichtiges vergessen..
Gruß Christian