gcc - make - headerfiles



  • Hi,

    ich verstehe nicht ganz wie man kompiliert, wenn bestimmte Strukturen mit Headerfiles existieren.

    Also ich habe mein Hauptprogramm main.c geschrieben. Dieses hat
    #include foo.h

    Es gibt noch foo.h und foo.c, welches foo.h implementiert.

    So weit ich bis jetzt das mit den Headerfiles verstanden habe, erstelle ich mit
    gcc -c foo.h
    erstmal foo.o. Muss also nichts mit foo.c machen, weil gcc anhand des Dateinames erkennt, dass foo.h in foo.c implementiert ist?

    Dann muss main.o erstellt werden mit
    gcc -c main.c

    Jetzt noch linken
    gcc -o main.x main.o foo.o

    Stimmt das so?



  • Nein, du musst alle *.c Files kompilieren, nicht die Headerfiles.


  • Mod

    Compilier bloß keine Header! Der GCC erstellt dann eine vorcompilierte Headerdatei. Dafür gibt es zwar sinnvolle Anwendungen, aber für jemanden, der gerade erst versucht, seine ersten Schritte in der Bedienung des Compilers zu machen, ist das verwirrend hoch drei.
    Lösch am besten auch alle .h.gch Dateien, falls du bereits welche erzeugt hast.



  • In main.c ist ja nur foo.h "included".
    Und es reicht foo.c zu kompilieren? foo.h dient nur als Art interface-Wegweiser?


  • Mod

    Helmse schrieb:

    In main.c ist ja nur foo.h "included".
    Und es reicht foo.c zu kompilieren? foo.h dient nur als Art interface-Wegweiser?

    Hier liegen einige Missverständnisse vor. Ich gebe dir mal ein paar Stichworte, aber ich empfehle dir sehr, dich naher mit den Themen zu beschäftigen:

    Was macht include? Allgemeiner: Was macht der Präprozessor?
    Der Präprozessor ist bloß eine ganz einfache Textersetzung. Das include im speziellen setzt den kompletten Inhalt der genannten Datei an der gewünschten Stelle ein.

    Was ist ein Header? Was steht in einem Header?
    Ein Header ist eine Sammlung von Deklarationen, keine Definitionen. Das heißt in einem Header steht beschrieben, wie Funktionen aufzurufen sind oder wie Klassen aufgebaut sind. Aber es steht kein konkreter Code im Header, wie diese Dinge sich verhalten (Semi-Ausnahme: Templates und Inlinefunktionen).

    Was will man beim Compilieren erreichen?
    Der Compiler soll Definitionen von Funktionen in konkreten Maschinencode umwandeln. Die Funktionsdefinitionen sind das, was in den Quellcodedateien steht (das Zeug zwischen den geschweiften Klammern einer Funktion). Dazu muss er noch wissen, wie die Aufrufe von anderen Funktionen in diesem Quelltext behandelt werden müssen. Dazu braucht er aber nicht zu wissen, wie die aufgerufenen Funktionen genau aussehen, es reicht eine Deklaration, die beschreibt, wie der Aufruf funktioniert.

    Was macht der Linker?
    Wenn man dann den Maschinencode für viele verschiedene Funktionen erzeugt hat, dann kann ein Linker sich diesen Code schnappen und gucken, welche Funktionsaufrufe da drin sind. Dann kann er daraus ein komplettes Programm erzeugen, in dem zu jedem Funktionsaufruf auch der passende Maschinencode existiert.



  • Alles verstanden, vielen Dank!


Anmelden zum Antworten