statische objektinstanz in statischer bibliothek



  • Hallo,

    ich habe folgendes problem:

    in einer statischen bibliothek existiert eine simple Klasse:

    // simpel.h
    
    class cl_Simple
    {
        public:
        cl_Simple();
        ~cl_Simple();
    
        protected:
        void Init();
    
    };
    
    // simpel.cpp
    
        cl_Simple::cl_Simple()
        {
           Init();
        }
    
        cl_Simple::~cl_Simple()
        {
        }
    
        cl_Simple::Init()
        {
           // perform some init stuff
        }
    
        // Create instance of cl_Simple
        cl_Simple simple_instance;
    

    Das Problem is nun folgendes:

    Binde ich diese bibliothek nun in ein projekt ein, wird die instanz von
    cl_Simple nicht erzeugt. Ich vermute, das liegt daran, dass es keine
    weiteren bezüge auf diese instanz gibt und der linker sie deshalb schlicht
    wegoptimiert.

    (simple_instance würde natürlich erzeugt werden, wenn ich das cpp file
    direkt in mein projekt einbinde und aus der lib entferne - das möchte ich aber
    ausdrücklich _nicht_)

    Ich arbeite mit VC++ 6.0 und habe bereits mit der linker option /OPT:NOREF
    experimentiert, allerdings ohne erfolg.

    Wie kann ich die erzeugung von simple_instance erzwingen ?



  • Wie kann ich die erzeugung von simple_instance erzwingen ?

    Das ist kein Standardproblem. Ich verschiebe dich mal ins VC Forum.



  • Bist du sicher, dass die Instanz nicht doch erzeugt wird?
    Ich habe auch VC++ 6, dieses Problem ist mir aber noch nie aufgefallen.

    Der Compiler/Linker hat AFAIK gar kein Recht so etwas wegzuoptimieren.

    Ich würde mir eher um was anderes Sorgen machen:
    Du hast absolut keine Möglichkeit festzulegen in welcher Reihenfolge globale, nicht-statische Objekte konstruiert werden. cout darfst du im Konstruktor deiner Klasse z.B. nicht verwenden, weil es vielleicht noch gar nicht existiert.



  • Hallo,

    zunächst mal danke für die antwort.

    Ich bin mir des problems bewusst, dass die initialisierungsreihenfolge
    globaler objekte nicht definiert ist. Gehen wir einfach mal davon aus,
    dass das für mich im moment keine rolle spielt.

    Fakt ist: Die objektinstanz wird nicht erzeugt. Ein simples OutputDebugString
    im ctor kann hier als test dienen. Es lassen sich nicht einmal Haltepunkte
    im code setzen, was für mich bedeutet: der code wird schlicht nicht eingebunden.

    Ansonsten stimme ich Dir zu. Meiner Meinung nach dürfte dieser code nicht wegoptimiert werden.

    Vorschläge wären sehr willkommen 😋



  • Ich habe mittlerweile in diversen Foren die Problematik dargelegt und sie ist
    nach allem, was ich rausfinden konnte, real.

    Für mich liegt die ungeliebte Lösung nun darin, meine Basisdienste nicht in
    Libraryform sondern als Sourcecode in meinen Projekten zu verwenden.

    Persönlich bin ich recht erschüttert über diese (mir bislang unbekannte) Einschränkung von C++ (VC++ ?), da sie die Implementierung bestimmter
    Mechanismen innerhalb von Libraries vollständig unterbindet.

    MfG.


Anmelden zum Antworten