Ich habe nächste Situation: Ich muss Widget in Standalone statische Bibliothek erstellen, die dann mit der endgültigen Anwendung (Visual C++ 9.0, Qt 4.5) verknüpft wird. Diese statische Widgetbibliothek enthält einige Ressourcen (Symbole) und besteht aus mehreren CPP-Dateien (die jeweils ein eigenständiges Widget enthalten). So weit ich weiß, muss ich qt resource system initialisieren, wenn ich sie (Ressourcen) in der statischen Bibliothek benutze, mit dem Aufruf von "Q_INIT_RESOURCE (resource_file_name)". Ich löste dies mit dem nächsten Code (in jeder CPP-Datei in statischer Bibliothek):Initialisierung von qt-Ressourcen in der statischen Bibliothek eingebettet
#include <QAbstractButton>
namespace {
struct StaticLibInitializer
{
StaticLibInitializer()
{
Q_INIT_RESOURCE(qtwidgets_custom_resources);
}
};
StaticLibInitializer staticLibInitializer;
}
// ... widget code ....
Statt meinem ersten Ansatz, ich getrennte init.cpp Datei in statischem Bibliothek-Projekt mit Initialisierungscode erstellt habe (zur Vermeidung von Initialisierung einschließlich Code in jeder CPP-Datei), aber das hat nicht funktioniert.
Warum das nicht funktioniert?
Ist dieser Ansatz mit StaticLibInitializer sicher und portabel zwischen verschiedenen Compilern und Plattformen?
In meiner aktuellen Situation habe ich drei .cpp-Dateien (jeder von ihnen implementiert sein eigenes Widget, zwei von ihnen verwenden Ressourcen aus .qrc-Datei), aber Initialisierungscode, den ich in der ursprünglichen Frage gab, nur in einer von ihnen und alle funktioniert gut (100%, nicht 50/50). Also ich kann nicht verstehen, warum, wenn ich Initialisierungscode in separaten init einlege.CPP-Datei Ich kann meine Ressourcen nicht verwenden, aber wenn dieser Code in einer der .cpp-Datei des Widgets funktioniert, funktioniert alles einwandfrei ... – cybevnm
Es macht nichts, es funktioniert gut ** jetzt ** :) Es funktioniert nur zufällig. Es kann nicht mehr funktionieren, sobald Sie einen anderen Compiler oder sogar eine andere Version desselben Compilers verwenden. Es ist ** UNDEFINIERTES VERHALTEN **. Der Grund, warum es jetzt funktioniert, liegt darin, dass, wenn Sie Initialisierungscode in einer der Dateien des Widgets haben, der Compiler ** passiert **, um Ihre Ressourcen zuerst zu initialisieren. Pures Glück, mehr nicht. Wenn Sie nicht möchten, dass Ihr Programm 0% an einem sonnigen Tag funktioniert, befolgen Sie die Anweisungen, um * statische Initialisierungsreihenfolge Fiasko * zu vermeiden. –
Wird die statische Initialisierungsreihenfolge vom Compiler bei der Kompilierungsphase definiert, oder kann die Reihenfolge zwischen den Programmen neu gestartet werden (ohne Neukompilierung)? – cybevnm