C-Header: noch ein Versuch



  • Hast du vielleicht vergessen, die Datei REAGAN21.c zu deinem Projekt hinzuzufügen? Der Header bringt nur die Deklarationen (so dass der Compiler nicht meckert), der eigentliche Code (Definition) steht in der .c-Datei, die zu einer obj-Datei kompiliert und zu deiner exe hinzugelinkt werden muss.



  • Hallo,

    Belli schrieb:

    Strohi schrieb:

    Ich bekomme als Meldung (nicht vom Compiler, sondern vom Linker)
    UNRESOLVED EXTERNAL SYMBOL xxx
    REFERENCE MADE TO UNRESOLVED SYMBOL xxx
    Das "xxx" steht hier für 40 Warnungen, die alle in dem Header <REAGAN21.H> deklarierten Variablen betreffen.

    Das sieht so aus, als wenn dem Linker eine REAGAN21.obj - Datei fehlt!

    _matze schrieb:

    Hast du vielleicht vergessen, die Datei REAGAN21.c zu deinem Projekt hinzuzufügen? Der Header bringt nur die Deklarationen (so dass der Compiler nicht meckert), der eigentliche Code (Definition) steht in der .c-Datei, die zu einer obj-Datei kompiliert und zu deiner exe hinzugelinkt werden muss.

    Naja, fast, wenn man sich die Header-Dateien ansieht, die er netterweise hier:

    http://www.delphipraxis.net/topic142627_cheaderdateien+einbinden.html

    gezeigt hat, dann muss man eigentlich nur die Kommentare in den Headern beachten (vielleicht gibt es sogar eine ezusb.lib), und dann kann es sogar funktionieren 😉

    MfG,

    Probe-Nutzer



  • Also: erst mal Danke für die Antworten von euch!
    Letztendlich hab ich es jetzt so gelöst, dass ich erst mal alle *.c und *.h Dateien zum Projekt hinzugefügt habe und das ganze Zeug mit dem "#include", etc. so belassen habe, wie ich es anfangs hatte. Dabei verstehe ich zwar nicht, was ich vorher falsch gemacht habe, aber trotzdem bin ich jetzt einfach froh, dass es jetzt endlich klappt! 😕

    Gruß,
    Stefan



  • Doch, jetzt sehe ich gerade, was ich gemacht habe: Ich habe eigentlich den ganzen Header <EZRegs.h> umgeschrieben: Hab alle Variablen mit einem extern versehen, die Adressen entfernt und in die EZRegs.c-Datei ausgelagert.
    Weiß jemand, warum das den Unterschied gemacht hat? In der Headerdatei stand nämlich schon immer

    #ifndef EZREGS_H	/* Header Sentry */
    #define EZREGS_H
    

    Ich meine, ob die Variablen jetzt im Header oder in der c-Datei deklariert werden, dürfte doch eigentlich egal sein, oder?
    Gruß,
    Stefan



  • Ähm, du hast einen FREMDEN Header umgeschrieben?! Das darf man, nie, niemals machen... 😉



  • Naja, was soll ich denn machen? Ich muss den Header in 2 verschiedenen c-files nutzen. Und in diesem Header sind die Variablen blöderweise nicht nur deklariert, sondern sogar definiert worden (mit genauer Speicheradressen-Zuweisung). Dann kam halt immer der Fehler "Multiple Public definitions"... Ich hab dann einfach vor alle Variablen ein "extern" vorangestellt und die Speicheradressen-Zuweisung entfernt und dann die genaue Definition in ein c-file geschrieben und das die Header-Datei includen lassen. Was hättest du denn gemacht?



  • Jaaa?



  • Strohi schrieb:

    ob die Variablen jetzt im Header oder in der c-Datei deklariert werden, dürfte doch eigentlich egal sein, oder?

    nein. wenn du eine variable ohne 'extern' deklarierst, dann wird gleichzeitig auch speicher für die variable angelegt und es gibt einen eintrag in die objektdatei. mit 'extern' wird dem compiler nur der typ einer bereits angelegten variable mitgeteilt.

    wenn du also im header kein 'extern' verwendest, dann wird in jeder objektdatei eine separate variable angelegt. die haben dann zwar den selben namen, sind aber verschiedene variablen mit eigenen speicherbereichen!



  • Konfusius schrieb:

    wenn du also im header kein 'extern' verwendest, dann wird in jeder objektdatei eine separate variable angelegt. die haben dann zwar den selben namen, sind aber verschiedene variablen mit eigenen speicherbereichen!

    Nein. Sofern die Variablen nicht als static deklariert wurden, dürfte es zu Linker-Mehrfachdefinitionen kommen. Erst mit static wird in jeder Übersetzungseinheit eigener Speicherplatz bereitgestellt (interne Linkage).



  • Nexus schrieb:

    Erst mit static wird in jeder Übersetzungseinheit eigener Speicherplatz bereitgestellt (interne Linkage).

    'static' bewirkt lediglich, daß in der objektdatei für den speicherplatz der variablen kein symbol angelegt wird. dadurch wird die variable für den linker unsichtbar.



  • _matze schrieb:

    Ähm, du hast einen FREMDEN Header umgeschrieben?! Das darf man, nie, niemals machen... 😉

    Jaa?
    Hier nochmal meine Frage an dich:
    Ich muss den Header in 2 verschiedenen c-files nutzen. Und in diesem Header sind die Variablen blöderweise nicht nur deklariert, sondern sogar definiert worden (mit genauer Speicheradressen-Zuweisung). Dann kam halt immer der Fehler "Multiple Public definitions"... Ich hab dann einfach vor alle Variablen ein "extern" vorangestellt und die Speicheradressen-Zuweisung entfernt und dann die genaue Definition in ein c-file geschrieben und das die Header-Datei includen lassen. Was hättest du denn gemacht?

    Gruß,
    Stefan


Anmelden zum Antworten