Ho una situazione successiva: ho bisogno di creare widget nella libreria statica autonoma, che sarà quindi collegata all'applicazione finale (visual C++ 9.0, qt 4.5). Questa libreria di widget statici contiene alcune risorse (icone) e consiste di diversi file .cpp (ognuno contiene un widget autonomo). Per quanto ne so, devo inizializzare il sistema di risorse qt, se li uso (risorse) nella libreria statica, con la chiamata a "Q_INIT_RESOURCE (resource_file_name)". Ho risolto questo con codice successivo (in ogni file cpp nella libreria statica):Inizializzazione delle risorse qt incorporate nella libreria statica
#include <QAbstractButton>
namespace {
struct StaticLibInitializer
{
StaticLibInitializer()
{
Q_INIT_RESOURCE(qtwidgets_custom_resources);
}
};
StaticLibInitializer staticLibInitializer;
}
// ... widget code ....
invece del mio primo approccio, ho creato il file init.cpp separata nel progetto di libreria statica con codice di inizializzazione (per evitare di includere l'inizializzazione codice in ogni file .cpp), ma questo non ha funzionato.
Perché questo non ha funzionato?
Questo approccio con StaticLibInitializer è sicuro e portatile tra vari compilatori e piattaforme?
Nella mia situazione attuale ho tre file .cpp (ognuno di loro implementa il proprio widget, due utilizzano risorse dal file .qrc), ma il codice di inizializzazione, che ho fornito nella domanda originale, solo in uno di essi e in tutti i lavori bene (100%, non 50/50). Quindi non riesco a capire, perché quando metto il codice di inizializzazione in init separato.cpp file Non posso usare le mie risorse, ma quando questo codice in uno dei file .cpp del widget funziona perfettamente ... – cybevnm
Non importa, funziona bene ** ora ** :) Funziona solo accidentalmente. Può smettere di funzionare nel momento in cui inizi a utilizzare un altro compilatore o anche un'altra versione dello stesso compilatore. È ** COMPORTAMENTO NON DEFINITO **. Il motivo per cui funziona ora è perché quando si ha il codice di inizializzazione in uno dei compilatori di file del widget ** accade ** per inizializzare prima le risorse. Pura fortuna, niente di più. Se non vuoi far funzionare il tuo programma 0% un giorno di sole segui le istruzioni per evitare * l'ordine di inizializzazione statico fiasco *. –
L'ordine di inizializzazione statico è definito dal compilatore in fase di compilazione, oppure l'ordine può variare tra i riavvii dei programmi (senza ricompilazione)? – cybevnm