frage zu statischer lib unter windows (visual 2003)



  • folgende frage:

    ich bekomme unter windows beim linken von einem projekt welches eine statische library benutzt einen linkerfehler fuer folgendes szenario:

    in der statischen lib gibt es ein modul a.cpp innerhalb welcher die implementierung fuer eine Klasse A zu finden ist. Im Konstruktor der Klasse A
    wird eine in einem anderen modul b.cpp (ebenfalls zur statischen lib gehoerend) global angelegte variable X verwendet.

    // A.cpp:
    extern long X;
    A::A()
    {
      long *tmp = &X;
    }
    
    // B.cpp:
    long X;
    

    Eine Instanz der Klasse A wird nun in einem anderen Teilprojekt, welches die statische lib verwenden soll, angelegt. Beim Uebersetzen dieses Projektes gibt es einen Linker-Fehler (undefined reference to X).

    wieso dies? Absicht ist es X fuer die Aussenwelt unsichtbar zu halten.

    Ideen?


  • Mod

    Dann wird die statische Bibliothek die du aus B.cpp erstellt hast, wohl nicht dazu gelinkt. Vielleicht reicht dir dieses Stichwort schon, ansonsten kann dir sicher gleich jemand erklären, wie man das bei VS 2003 (Hallo! Es ist 2011 2012 und es kommt ca. alle 2 Jahre eine neue Version!) genau macht.



  • wir haben leider am arbeitsplatz momentan aus lizenstechnischen-gruenden ne 2003er version :))

    Dann wird die statische Bibliothek die du aus B.cpp erstellt hast, wohl nicht dazu gelinkt.

    Doch wird sie. Das Problem taucht nur unter Windows mit Visual auf. Unter ner Linux Kiste mit BSD und KDevelop gibt es keine Probleme.

    Aber vielleicht habe ich ja mit meinem unguten gefuehl recht, wenn ich darueber nachdenke, dass die Instanz der Klasse A (welche ja in der Bibliothek implementiert ist) in dem Projekt, welches die Lib verwenden will, erstellt wird.

    Beim Linken will nun der Linker wissen, was es mit dem X auf sich hat, findet aber nix, da das X nur einmalig in dem modul a.cpp der statischen lib mit extern angegeben wurde.
    ich glaube link-reihenfolgen spielen hier vielleicht auch mit !?!?

    😕



  • ach uebrigens noch ein nachtrag:

    alles was in a.cpp oder in b.cpp steht ist innerhalb eines
    namespaces.



  • rb schrieb:

    wir haben leider am arbeitsplatz momentan aus lizenstechnischen-gruenden ne 2003er version :))

    Kündige. Von einem ordentlichen Unternehmen erwarte ich mir mindestens eine 2008er Version.


  • Mod

    Naja, wir als Ausenstehende können da entweder dir oder deinem Linker glauben. Und ich fürchte, da werden die meisten wohl zu der Maschine halten.


Anmelden zum Antworten