Initialisieren qt-Ressourcen eingebettet in statische Bibliothek
Hab ich nächste situation: ich benötige zum erstellen von widgets im standalone-statische Bibliothek, die dann verknüpft wird mit der definitiven Anwendung (visual c++ 9.0, qt 4.5).
Diese statischen widget-Bibliothek enthält einige Ressourcen (icons), und bestehen aus einem mehrere .cpp-Dateien (jede enthält standalone-widget). Soweit ich weiß, muss ich initialisieren qt-resource-system, wenn ich Sie benutzen (Ressourcen) in der statischen Bibliothek mit aufrufen zum "Q_INIT_RESOURCE( resource_file_name )". Ich löste dies mit folgenden code (in jeder .cpp-Datei in statische Bibliothek):
#include <QAbstractButton>
namespace {
struct StaticLibInitializer
{
StaticLibInitializer()
{
Q_INIT_RESOURCE(qtwidgets_custom_resources);
}
};
StaticLibInitializer staticLibInitializer;
}
//... widget code ....
Anstelle von meinem ersten Ansatz habe ich separate init.cpp Datei im static-library-Projekt mit dem code für die Initialisierung (um zu vermeiden, einschließlich der code für die Initialisierung in jeder .cpp-Datei), aber das hat nicht funktioniert.
Warum dies nicht funktioniert hat ?
Ist dieser Ansatz mit StaticLibInitializer ist sicher und portabel zwischen verschiedenen Compilern und Plattformen ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hat nicht funktioniert, weil Sie es geschafft haben, durch Treffer static initialization order fiasco.
Können Sie nicht bewegen Sie Ihren code initialisiert statische Objekte außerhalb der übersetzungseinheit (Sie können es hier Lesen-source-Datei), wo diese statischen Objekte verwendet werden. Nicht so, wie Sie es getan hat. Wenn Sie möchten, verwenden Sie das Schema, das Sie verwenden, um zu initialisieren diese statische Objekte bewegen als nur Erklärungen zu Ihrem init.hpp-header-aber lassen instatiations
StaticLibInitializer staticLibInitializer;
in jeder Datei, die verwendet statische Objekte.Über die Beratung übernimmt jedes widget verwendet nur seine eigenen Ressourcen. Wenn Sie eine situation, in die ein widget-Ressourcen verwendet werden, durch ein anderes widget, das Sie laufen in static initialization order fiasco wieder. Sie verwalten können diese situation, indem Sie mit code wie diesem
stellen Sie sicher, multiplizieren Umschreibungen StaticLibInitializer wird initialisiert bestimmte Ressource nur einmal und dann instanziieren StaticLibInitializer für jede Ressource, die Sie verwenden, in der übersetzung Einheit.
Den Q_INIT_RESOURCE makro kann nicht verwendet werden, die in einem namespace.
Lassen Sie mich zitieren aus der qt-Handbuch: "Hinweis: Dieses makro kann nicht verwendet werden, die in einem namespace. Es sollte aufgerufen werden main()". Und auch es gibt Ihnen ein Beispiel, wie es richtig zu machen, wenn dies nicht möglich ist:
Schauen Sie bitte selbst, warum und wie genau es scheitert oder nicht scheitert, wenn Sie es in einer unspezifizierten Weise. Der entsprechende code ist in QtCore.
inline
oben nicht kaufen Sie nichts, da Sie keine Garantie darauf geachtet werden, die von einem compiler. Nicht Achtung dieses Schlüsselwort wird gemäß c++ - standard. Also, wenn das Lösung basiert auf der Annahme, inline-Funktion inline ist es gebrochen.inline
Funktionen haben leicht unterschiedliche Semantik, vor allem, wenn es um das OS. Da wir nicht wissen, die makro-expansion vonQ_INIT_RESOURCE
auf allen Plattformen, es ist schwer zu beurteilen, wenn das erforderlich ist. Es ist sicherlich vernünftig zu setzen.