Tengo la siguiente situación: Necesito crear un widget en la biblioteca estática independiente, que luego se vinculará con la aplicación final (visual C++ 9.0, qt 4.5). Esta biblioteca de widgets estáticos contiene algunos recursos (iconos) y consta de varios archivos .cpp (cada uno contiene un widget independiente). Por lo que sé, debo inicializar el sistema de recursos qt, si los uso (recursos) en la biblioteca estática, con la llamada a "Q_INIT_RESOURCE (resource_file_name)". He resuelto esto con el siguiente código (en cada archivo .cpp en la biblioteca estática):Inicializando recursos qt incrustados en la biblioteca estática
#include <QAbstractButton>
namespace {
struct StaticLibInitializer
{
StaticLibInitializer()
{
Q_INIT_RESOURCE(qtwidgets_custom_resources);
}
};
StaticLibInitializer staticLibInitializer;
}
// ... widget code ....
En lugar de mi primer acercamiento, he creado el archivo init.cpp separada en el proyecto de biblioteca estática con el código de inicialización (para evitar la inclusión de inicialización código en cada archivo .cpp), pero esto no funcionó.
¿Por qué esto no funcionó?
¿Este enfoque con StaticLibInitializer es seguro y portátil entre varios compiladores y plataformas?
En mi situación actual, tengo tres archivos .cpp (cada uno de ellos implementa su propio widget, dos de ellos usan recursos del archivo .qrc), pero el código de inicialización, que proporcioné en la pregunta original, solo en uno de ellos y todo funciona bien (100%, no 50/50). Entonces no puedo entender, ¿por qué cuando pongo el código de inicialización en init por separado?Archivo cpp No puedo usar mis recursos, pero cuando este código en uno de los archivos .cpp del widget funciona bien ... – cybevnm
No importa que funcione bien ** ahora ** :) Funciona solo por accidente. Puede dejar de funcionar en el momento en que empiece a usar otro compilador o incluso otra versión del mismo compilador. Es ** COMPORTAMIENTO INDEFINIDO **. La razón por la que funciona ahora es porque cuando tienes el código de inicialización en uno de los archivos del widget, el compilador ** sucede ** para inicializar tus recursos primero. Pura suerte, nada más. Si no desea que su programa funcione 0% un día soleado, siga las instrucciones para evitar * fiasco de orden de inicialización estática *. –
¿El orden de inicialización estático está definido por el compilador en la fase de compilación, o el orden puede variar entre reinicios de los programas (sin recompilación)? – cybevnm