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.