Frage

Ich habe eine Anwendung, die eine statische Bibliothek verwendet ich gemacht. Eine CPP-Datei in der Bibliothek hat eine statische Variablendeklaration, dessen Ctor ruft eine Funktion auf einem Singleton die tut etwas- z.B. fügt einen String.

Nun, wenn ich die Bibliothek aus der Anwendung verwenden, meine Singleton scheint keine Spuren der Zeichenfolge zu enthalten, die hinzugefügt werden sollten zu.

Ich vermisse definitiv etwas, aber ich weiß nicht, was ..

War es hilfreich?

Lösung

Wenn Sie ein Objekt in einer statischen Bibliothek, die nicht ist EXPLIZIT in der Anwendung verwendet. Dann wird der Linker nicht zieht das Objekt aus dem lib in die Anwendung.

Es gibt einen großen Unterschied zwischen statischen und dynamischen Bibliotheken.

Dynamische Bibliothek:
Bei der Kompilierung wird nichts von der dynamischen Bibliothek gezogen. Extra-Code hinzugefügt, um die Symbole zur Laufzeit explizit zu laden und zu lösen. Zur Laufzeit wird die gesamte Bibliothek geladen und somit Objektinitialisierer genannt (obwohl, wenn ist die Umsetzung Detail).

Statische Bibliotheken sind sehr unterschiedlich gehandhabt:
Wenn Sie einen Link gegen eine statische Bibliothek zieht es alle Einzelteile, die nicht in der Anwendung definiert sind, die in der Bibliothek in der Anwendung definiert werden. Dies wird wiederholt, bis es keine weiteren Abhängigkeiten, die die Bibliothek auflösen kann. Der Nebeneffekt ist, dass Objekte / Funktionen nicht explizit verwendet werden, nicht bilden die Bibliothek gezogen (also globale Variablen, die nicht direkt zugegriffen werden, werden nicht gezogen werden).

Andere Tipps

Die Erinnerung an das ist ein wenig verschwommen, aber Sie könnten mit einem Initialisierungsreihenfolge Problem getroffen werden, zu werden. Es gibt keine Garantien, bei denen statische Variableninitialisierungen in verschiedenen Dateien bestellen aufgerufen, also, wenn Ihr Singleton noch nicht initialisiert wird, wenn Ihre statische Variable in der Bibliothek initialisiert wird, das könnte den Effekt erzeugen Sie sehen.

So wie ich, um diese Probleme bekommen habe, ist eine Art von einer expliziten init Funktion zu haben, die das Zeug hat, und dass ich zu Beginn der main oder etwas nennen. Sie könnten mit dem Auftrag zur Geige der Lage sein, in dem Sie die Objektdatei und Bibliothek Argumente für den Compiler geben (oder Linker, tatsächlich), denn das ist auch für mich gearbeitet, aber diese Lösung ist ein wenig zerbrechlich, weil es nicht nur hängt die zur Verwendung von spezifische Linker, aber wahrscheinlich auch die spezifische Version.

Umgestalten die Klassen tun statische Initialisierung, so dass sie auf andere solche Klassen nicht abhängen. Das heißt, macht jede Klasse Initialisierung unabhängig und autark.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top