globale in headerfiles



  • Hallo

    folgendes Problem - ich habe ein Headerfile das Macros, typedeklarationen und globale
    Variablen enthält.
    Variablen sind als extern deklariert - beim linken bekomme ich immer den LNK2019 - warum sind die für den linker nicht sichtbar - der compiler läuft durch??

    Gruss Peter



  • Pack die Definition in das passende .cpp-File und füge zum Header ein "extern T foo;" hinzu.



  • dagute schrieb:

    warum sind die für den linker nicht sichtbar - der compiler läuft durch??

    Weil extern für den Compiler bedeutet: Du kannst annehmen, dass diese Variable da ist, der Linker kümmert sich schon drum.

    Dumm ist das nur, wenn der Linker sie nicht findet.

    Deshalb brauchst du irgendwo ein Source-File, das diese nochmal definiert und zwar ohne extern.


  • Mod

    Variablen sind als extern deklariert

    Eben: Sie sind deklariert. Und zwar mit extern . Das bedeutet, dass die Deklaration keine Definition ist. Und das wiederum bedeutet, dass die Objekte noch irgendwo definiert werden müssen. Sind sie das nicht, findet der Linker selbstverständlich keine Definition und beschwert sich über einen nicht aufgelösten externen Verweis.



  • Mein Code ist C nicht C++
    habe jetzt ein ifdef __cplusplus { "C" endif um den header gesetzt und die
    external Schlüsselwörter gelöscht - jetzt gehts.

    Aber mir ist nicht so klar warum



  • dagute schrieb:

    Mein Code ist C nicht C++

    Das ändert nichts.

    habe jetzt ein ifdef __cplusplus { "C" endif um den header gesetzt und die
    external Schlüsselwörter gelöscht - jetzt gehts.

    Aber mir ist nicht so klar warum

    Am extern "C" liegts nicht.
    Ohne extern hast du nun eine Variablen Definition im Header.
    Wenn du den Header in einem Sourcefile inkludierst, wird diese Definition eingefügt. Der Compiler hat seine Deklaration (weil Definition immer auch Deklaration ist) und der Linker seine Definition. Alle sind glücklich.
    Inkludierst du den Header aber in einer anderen Datei wird dort ebenfalls die Definition eingefügt. Der Compiler hat immer noch seine Deklaration, aber der Linker hat nun zwei Definitionen und wird sich beschweren.
    Die Lösung wurde bereits geschrieben: Definiere die Variable zusätzlich in einer Sourcedatei.



  • Danke Nathan das ist verständlich -

    ich habe jetzt 3 verschiedene .c files die alle den Header benutzen - und es lässt
    sich einwandfrei builden.
    Es wird jedoch nur eine .obj datei erstellt - sollten das nicht 3 sein?


Anmelden zum Antworten