001
30.08.2003, 16:31 Uhr
Pablo
Supertux (Operator)
|
ich weiß auch wirklich nicht, wieso man das so macht. Aber wenn du dir die Header Dateien genauer anguckst, findest du meistens nur die Deklaration von den Variablen, Klassen, Konstanten usw. Die Header Datei ist sozusagen da, um dem Compiler mitzuteilen: es gibt diese Variable, und diese Klasse usw.
Ich finde schon übersichtlicher, wenn ich in der CPP Datei nur Code habe. Eine Header Datei wird meistens von mehr als eine CPP Datei eingebunden, weil sie nur "wissen wollen", was zur Verfügung steht.
Cer Compiler kompiliert nur, er weiß nicht, wo die Sachen sind. Der sich darum kümmert, den Code von eine Funktion bzw. Klasse zu finden ist der Linker.
Bsp: Das ist ein kleines einfaches Beispiel in Linux mit gcc
C++: |
// myhead.h #ifndef MYHEAD_H #define MYHEAD_H #include <stdio.h> extern char* string; // ohne extern gibt es Ärger, darum kümmerst sich der Linker void write(); #endif ///////////////////////////////////////////// // main.c #include "myhead.h" int main() { string = ", Welt"; printf("Hallo%s\n",string); write(); // wenn der Compiler das kompiliert, weißt nur, dass es diese Funktion gibt // der Linker weißt wo. printf("ciao!\n"); } ////////////////////////////////////////////// //write.c #include "myhead.h" char* string; void write() { printf("Hallo%s\n",string); }
|
Jetzt werden wir das kompilieren:
Code: |
gcc -c main.c gcc -c write.c
|
main.c weißt von myheader, dass die Fuktion write und die Variable string zur Verfügung stehen. Er kompiliert nur den Code, ist ihm aber egal, wo die sich befinden. write.c implementiert die Funktion und die Variable.
Der Rest ist die Arbeit vom Linker:
Code: |
gcc -o write main.o
|
Das supckt folgeden Fehler: main.o: In function `main': main.o(.text+0x8): undefined reference to `string' main.o(.text+0x14): undefined reference to `string' collect2: ld returned 1 exit status Aber
Code: |
gcc -o write main.o write.o
|
erzeugt eine gültige Binäerdatei "write". Der Linker sucht nach diesen beiden Sachen und findet sie in der Datei write.o, deshalb funktioniert es. Die Ausgabe:
Code: |
Hallo, Welt Hallo, Welt ciao!
|
ich hoffe, dass ich dir weitergeholfen hab und nicht die was erzählt hab, was du schon weißt. -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 30.08.2003 um 16:32 Uhr von Pablo Yanez Trujillo editiert. |