001
24.03.2011, 16:48 Uhr
0xdeadbeef
Gott (Operator)
|
Der Ablauf der Kompilation eines (einfachen) C-Programms ist hier sehr schön veranschaulicht:
www.eng.hawaii.edu/Tutor/Make/1-4.html
Statische Bibliotheken - das sind die .a-Dateien - sind im Wesentlichen ein Archiv, das eine Reihe von .o-Dateien enthält. Du kannst sie mit ar behandeln, beispielsweise gibt
die in libfoo.a eingepackten .o-Dateien aus. Es gehört noch ein kleines bisschen mehr dazu, aber das sind dann eher Implementationsdetails; wenn sie dich interessieren, schlag ranlib nach. Neben statischen gibt es auch dynamische Bibliotheken (unter Linux mit der Endung .so); diese werden erst bei Programmstart an das Programm gelinkt. So können mehrere Programme die selbe Bibliotheksdatei benutzen, man spart Platz, und neuere Versionen der Bibliothek können (Binärkompatibilität vorausgesetzt) dem Programm einfach untergeschoben werden, ohne es erneut linken zu müssen.
Per Konvention enthalten Header Deklarationen, die zum Gebrauch anderer Übersetzungseinheiten gebraucht werden. Im Beispiel, wie es hinter dem Link erklärt wird: Wenn du in green.c eine Funktion definierst und sie in blue.c benutzen willst, muss blue.c wissen, dass es diese Funktion gibt, sie aber selbst nicht definieren (sonst wüsste der Linker nachher nicht, welches Symbol er benutzen soll). Daher kommt die Deklaration der Funktion in den Header, die Definition in die Quelldatei. Technisch ist ein Header nur eine Textdatei, und #include macht (wie alle Präprozessordirektiven) schlicht Textersetzung.
bedeutet: Füge hier den Inhalt von common.h ein, bevor das Ganze an den Compiler geht. Ich kann prinzipiell
C++: |
int #include "foo.txt" () { return 0; }
|
schreiben, wenn in foo.txt
steht. Ich sollte das aber nicht tun, weil da nachher keine Sau mehr durchfindet.
Ich vermute, dass die .m-Dateien Objective-C enthalten, kann das aber aus der Entfernung nicht sicher sagen. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |