017
04.10.2003, 13:58 Uhr
Pablo
Supertux (Operator)
|
Gib g++ --help oder info g++ oder man g++ und lese die Doku. @Flo hat Recht, du musst die Source Dateien übergeben, sonst kann er nicht kompilieren, shell Programme sind nun mal so, man muss sie immer Argumente übergeben.
Also ein Beispiel:
C++: |
// a.h :: sie hat nur eine einfache Klasse #ifndef CLASS_A #define CLASS_A class A{ int a; public: A(); A(int); int getA(); }; #endif
|
Jetzt versuche zu kompilieren:
Du bekommst den Fehler, dass die Datei keine Soruce sondern Header Datei ist.
C++: |
// a.cpp #include "a.h" A::A() { this->a = 0; } A::A(int zahl) { this->a = zahl; } int A::getA() { return this->a; }
|
Jetzt kompiliere. Die Option -c erstellt ein Objekt, somit werden die Dateien nicht gelinkt. Der Standardname ist der Name der .cpp bzw. .c Datei und die Enden .o. Mann kann aber den Namen ändern und g++ spuckt edie Datei mit einem anderen Namen aus. Das macht man mit der Option -o neuer_name.
Code: |
$ g++ -o myprogramm a.cpp
|
g++ wird a.cpp kompilieren, linken und wenn das alles erfolgreich ist, das ausführende Programm in myprogramm schreiben. Aber hier gibt es keine myprogramm Datei, weil nämlcih ein Fehler aufgetretten ist: Es gibt keine main Referenz. Ohne main() kann ein Programm nicht gestartet werden, also kann der linker nicht die Datei myprogramm erstellen und gibt die Fehlermeldung aus. Ohne -c hat g++ die Datei a.cpp in eine temporä Datei kompiliert und sie gelinkt. Du kannst aber nur ein Objekt erstellen. Objekte sind gut, wiel man sehr viel Zeit sparrt. Stell dir vor, du musst den Linker 10 Dateien übergeben und der Compiler braucht min. 10 Sek. pro Datei. Wenn du etwas änderst (sagen wir aml nur eine einzige Zeile einer cpp Datei) und jedesmal alles kompilierst und linkst, dann brauchst du mindestens 100 Sekunden + zeit des Linkers. Wenn du aber vorher nur Objekte hattest, brauchst du nur ein neues Objekt zu kompilieren, dessen Source Datei geändert wurde und nur neu linken. Dann brauchst du nur 10 Sekunden + Zeit des Linkers und das ist viel besser.
Nun, kompilieren wir nur ein Objekt.
Die Datei a.o wird erzeugt. a.cpp wurde kompiliert aber nicht gelinkt.
C++: |
// test.cpp #include <iostream> #include "a.h" int main() { A s(34); std::cout << "A::a = " << s.getA() << std::endl; }
|
Wir können nun diese Datei nur kompilieren und danach alle Objekte linken oder kein Objekt erstellen.
Die Datei test.o wurde erzeugt, Nun linken wir mal a.o und test.o ud erzeugen wir die Datei mytest
Code: |
$ g++ -o mytest a.o test.o
|
Die Datei mytest wurde erzeugt, Aber wir können auch
Code: |
$ g++ -o mytest a.cpp test.cpp
|
so kompilieren, aber a.cpp und test.cpp werden nochmal kompiliert und ihre Objekte in temporär Dateien gespeichert und danach gelinkt, usw. Du musst immer die Referenzen übergeben, sonst kann der Linker nicht mache Funktionen und Variablen, die nicht in einer cpp / h Datei deklariert worden sind. Ein Beispiel:
Code: |
$ g++ -o mytest test.cpp
|
Er wird zuerst s(34) nicht kompilieren und die Funktion A::getA() ist für den Linker eine unbekannte Referenz. Also du musst dem g++ alle Dateien übergeben, die etwas miteinander zu tun haben. -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! |