2009-08-19 10 views
3

Ich habe folgendes Problem: Mein (C++ -) Projekt besteht aus mehreren Teilprojekten. In jedem habe ich mehrere Dateien mit Code, den ich beim Start ausführen möchte. Meine Lösung ist so weit statische Variablen zu verwenden, die den jeweiligen Code auf Initialisierung wie folgt aufrufen:Wie verhindert man, dass der Linker Startup Code weg optimiert?

// Foo.cpp 

static TFooRegistry sFooRegistry; // does stuff in constructor. 

Wenn mein Projekt den Aufbau mit DLLs für jedes Teilprojekt, funktioniert alles einwandfrei und der Code ausgeführt wird, wie erwartet. Wenn die Teilprojekte jedoch statisch verknüpft werden, stellt der Linker fest, dass Foo.o keinen Code enthält, der jemals von außen referenziert wurde, und optimiert ihn. Natürlich könnte ich einen Verweis auf sFooRegistry woanders hinzufügen, aber das ist mühsam und fehleranfällig.

Welche (standardkonforme) Art der Lösung gibt es?

OK, was kann ich auf Mac/Gcc tun und Win/Visual Studio?

Antwort

4

Es gibt keine standardkonformen Methoden, um Objekte in Bibliotheken zu initialisieren - Sie müssen je nach Ihrer (n) Plattform (en) Tricks anwenden. Der Unterschied zwischen einer DLL und einer statischen Bibliothek (zumindest unter Windows) besteht darin, dass der Former einen Start- und Shutdown-Code hat, der vom Betriebssystem ausgeführt wird, während letzteres nur eine Verkettung von Objektdateien ist.

Auch der Linker optimiert Ihren Startcode nicht - er verbindet ihn einfach nicht, weil er scheinbar nie benutzt wird. Linker sind ziemlich dumme Bestien - wenn Sie herausfinden wollen, wie sie tun, was sie tun, werfen Sie einen Blick auf das Buch Linkers & Loaders.

+0

Doh! Lieber Bjarne: Warum? – Tobias

+0

Was ist der Unterschied zwischen einem Linker, der Code optimiert und nicht verbindet? Ich dachte, das wären nur zwei Namen für die gleiche Sache. – Tobias

+0

C++ wurde entwickelt, um mit vorhandenen Linkern zu arbeiten (siehe Stroustrups D & E-Buch), die kein Konzept von Konstruktoren hatten/haben. –

1

Einige Trick, aber überprüfen Sie es. Für Win-System (aber nicht Linux) verwenden explizite dllexport - in diesem Fall weiß Linker nicht, ob dieses Symbol von äußeren App oder nicht verwendet wird.

Verwandte Themen