Compilieren mit selbtgeschriebenen Headern funktioniert nicht
-
Hallo, ich hoffe jemand kann mir hier weiterhelfen. Ich mache irgend einen dummen Fehler der so offensichtlich ist, das ich ihn nicht sehe.
Ich möchte ein Programm compilieren unter Linux. Aber obwohl die Dateien alle im selben Verzeichnis liegen kommt vom Compiler immer die Meldung, dass er die Funktion nicht kennt, wenn ich die .h-Datei inkludiere, aber nicht mit der .c-Datei. Als Beispiel:#include <stdio.h> void ausgabe() { printf("Hallo Welt\n"); }
(hallowelt.c)
void ausgabe();
(hallowelt.h)
#include "hallowelt.h" int main() { ausgabe(); }
(test.c)
Wenn ich das jetzt mit "gcc test.c" compilieren will kommt die Meldung, er kennt ausgabe() nicht.
Woran liegt das?
-
"gcc test.c hallowelt.c -o hallowelt"
-
K, danke. So geht das compilieren. Aber was ist dann der der Sinn einer Header-Datei, wenn ich letztlich sowieso immer noch auf die .c-Datei verweisen muss? Da könnt ich dann ja auch gleich #include "hallowelt.c" schreiben, da geht dann sogar noch das compilieren einfacher, weil ich nur gcc test.c schreiben muss, statt auch noch die zu den Headern gehörenden C-Dateien aufzulisten.
-
Burdy2 schrieb:
K, danke. So geht das compilieren. Aber was ist dann der der Sinn einer Header-Datei, wenn ich letztlich sowieso immer noch auf die .c-Datei verweisen muss? Da könnt ich dann ja auch gleich #include "hallowelt.c" schreiben, da geht dann sogar noch das compilieren einfacher, weil ich nur gcc test.c schreiben muss, statt auch noch die zu den Headern gehörenden C-Dateien aufzulisten.
Ja, und sobald du in mehr als einer c-Datei die gleiche c-Datei per include einbindest, hast du Linker Fehler wegen doppelter Imnplementationen...
-
Burdy2 schrieb:
Da könnt ich dann ja auch gleich #include "hallowelt.c" schreiben, da geht dann sogar noch das compilieren einfacher, weil ich nur gcc test.c schreiben muss, statt auch noch die zu den Headern gehörenden C-Dateien aufzulisten.
für kleine programme ist das auch der richtige weg.
-
~fricky schrieb:
Burdy2 schrieb:
Da könnt ich dann ja auch gleich #include "hallowelt.c" schreiben, da geht dann sogar noch das compilieren einfacher, weil ich nur gcc test.c schreiben muss, statt auch noch die zu den Headern gehörenden C-Dateien aufzulisten.
für kleine programme ist das auch der richtige weg.
edit: natürlich nicht das #include xxx.c, sondern alles in eine datei zu stecken.
-
Burdy2 schrieb:
K, danke. So geht das compilieren. Aber was ist dann der der Sinn einer Header-Datei, wenn ich letztlich sowieso immer noch auf die .c-Datei verweisen muss?
Du musst nicht auf die .c-Datei verweisen, es reicht die .o-Datei. Also es geht auch so:
gcc -c foo.c => foo.o
gcc -c bar.c => bar.o
gcc foo.o bar.o => linkt beide Objektdateien zu a.out zusammenBei vielen c-Dateien macht sich das bezahlt, weil du bei Änderungen nur die davon betroffenen Dateien nue übersetzen musst. Und um das ganze zu managen benutzt man make oder ein ähnliches Tool, von Hand ist das natürlich nicht zu empfehlen.
-
Danke für die Antworten.