c programm aus mehreren Quelldateien erstellen ERLEDIGT
-
Hallo,
ich bin langsam am Ende meines Grundkurs Buches für C angekommen. Jetzt stellt sich mir aber langsam die frage wie man es macht wenn man ein C-Programm in mehrere Dateien aufteilen möchte.
Beispiel:
Datei 1, output.c#include<stdio.h> void gibAus() { printf("Hallo Welt aus Datei 1"); }
Datei 2, main.c:
#include<stdio.h> int main(void) { gibAus(); }
Wie geb ich jetzt der main.c bekannt das in der output.c eine Funktion bereit steht die sie verwenden soll.
Wird sowas über eine Header-Datei gemacht das man die output.c in eine output.h ändert?IDE: Eclipse
Compiler: gcc
BS: Mac OSX, Linux(Kubuntu)Ich hoffe ich habe alle wichtigen Daten bekannt gegeben.
Danke schon einmal für eure Hilfe.
-
Du machst eine Headerdatei output.h:
void gibAus();
und in main.c kommt dann noch:
#include "output.h"
Durch die "" wird erst im aktuellen Verzeichnis gesucht.
Dem Compiler musst du dann aber beide C-Dateien mitteilen.Damit der Compiler bei mehrfachen include nicht durcheinander kommt, schreibt man die output.h besser:
#ifndef OUTPUT_H #define OUTPUT_H /* output.h fuer Blablup */ void gibAus(); #endif
-
Danke schon einmal für die Antwort.
Eines ist mir aber jetzt noch immer nicht klar.Es gibt jetzt folgende Dateien:
- main.c
- output.h- gibt es die output.c Datei jetzt noch?
In der der Header Datei wird ja nur der Funktionskopf deklariert, aber der eigentliche Code wäre ja in der output.c vorhanden.
Ich hoffe ich versteh das jetzt richtig.
Gruß
-
Klar, output.c gibts noch. Wie du selbst sagst ist die Header-Datei nur mit Deklarationen (bzw. bei dir nur eine) gefüllt, während die C-Datei die definition enthält.
Wird typischerweise so gemacht um Programme in einzelne Module geteilt werden können, ohne Gefahr zu laufen das man beim Linken Konfilkte bekommt.
-
Richtig. Die output.c gibt es natürlich auch noch, irgendwo muss die Funktion ja definiert sein.
Theoretisch könntest Du die output.h auch sparen, und die Deklaration in der main.c selbst machen.
Allerdings ist das unpraktisch, wenn die output.h/output.c in grösseren Projekten mal wächst und mehrere Funktionen deklariert/definiert, die dann auch noch in anderen Quellmodulen eingebunden werden müssen. Deshalb ist die Erstellung einer Headerdatei die übliche Vorgehensweise, so kann man in allen Modulen, die Funktionen aus der output.c benötigen, die notwendigen Deklarationen einfach mit einem #include - Statement einbinden.
-
Okay, dass hab ich jetzt so weit verstanden, aber eine kleine frage hab ich jetzt noch.
Wie ist der output.h bekannt das in der output.c die Definition enthalten ist?
Läuft das ganze über die Namen ab? Sprich das für input.h es eine input.c geben muss usw.?Vielen dank schon einmal für euren Einsatz!
-
Das weißt du.
Und du musst es auch dem Compiler sagen.Das #include fügt die genannte Datei (z.B. output.h) in main.c ein.
Dann wird main.c compiliert nach main.o
Dann wird output.c compiliert nach output.o
Danach werden die beiden .o Dateien zum fertigen Programm verbunden (gelinkt).Du musst über eine Projektdatei (in Eclipse) oder ein makefile oder über die Kommandozeile dem Compiler mitteile, das er zwei Dateien (main.c und output.c) compilieren soll.
-
Das ist der output.h nicht bekannt. Muss es auch nicht. Die output.h ist ja nur dafür da, die Deklarationen in die Module zu bringen, die die output.c - Funktionen benutzen wollen.
Die Erstellung der ausführbaren Datei erfolgt ja dann in zwei Schritten:
Erst werden main.c und output.c kompiliert. Zu dem Zeitpunkt ist in main.c durch die Deklaration nur bekannt, dass es eine Funktion namens gibAus gibt, und was sie für eine Signatur/Rückgabewert hat, nicht aber, wo sie definiert ist. Danach werden die Ergebnisse des Compilerlaufs - die Objektdateien main.o und output.o zusammengelinkt, und der Linker sucht nun in allen ihm übergebenen Objektdateien nach der Definition der benutzten Funktionen.
-
Okay, dass sitzt jetzt auch soweit. Habe bemerkt das durch Eclipse der Bezug zum Linken irgendwie noch nicht vorhanden ist. Sollte das vllt ein paar mal ganz altmodisch über die Konsole machen und genauer drauf achten was wie läuft.
Nochmals danke für die guten und schnellen Antworten.