Mam następną sytuację: Potrzebuję utworzyć widget w samodzielnej bibliotece statycznej, która następnie zostanie połączona z aplikacją końcową (wizualne C++ 9.0, qt 4.5). Ta statyczna biblioteka widgetów zawiera niektóre zasoby (ikony) i składa się z kilku plików .cpp (każdy zawiera samodzielny widget). O ile mi wiadomo, muszę zainicjować system zasobów qt, jeśli użyję ich (zasobów) w bibliotece statycznej, z wywołaniem do "Q_INIT_RESOURCE (resource_file_name)". Rozwiązałem to z kolejnego kodu (w każdym pliku .cpp w bibliotece statyczne):Inicjowanie zasobów qt osadzonych w bibliotece statycznej
#include <QAbstractButton>
namespace {
struct StaticLibInitializer
{
StaticLibInitializer()
{
Q_INIT_RESOURCE(qtwidgets_custom_resources);
}
};
StaticLibInitializer staticLibInitializer;
}
// ... widget code ....
Zamiast moim pierwszym podejściu, stworzyłem osobny plik init.cpp w projekcie biblioteki statycznej z kodem inicjującym (aby uniknąć tym inicjalizacji kod w każdym pliku .cpp), ale to nie zadziałało.
Dlaczego to nie zadziałało?
Czy to podejście ze StaticLibInitializer jest bezpieczne i przenośne wśród różnych kompilatorów i platform?
W mojej obecnej sytuacji mam trzy pliki .cpp (każdy z nich implementuje swój własny widget, dwa z nich używają zasobów z pliku .qrc), ale kod inicjujący, który podałem w oryginalnym pytaniu, tylko w jednym z nich i wszystkich pracach dobrze (100%, nie 50/50). Więc nie mogę zrozumieć, dlaczego kiedy wstawiłem kod inicjujący w osobnym init.Plik cpp Nie mogę używać moich zasobów, ale kiedy ten kod w jednym z plików .cpp widżetu działa dobrze ... – cybevnm
Nie ma znaczenia, że działa dobrze ** teraz ** :) Działa tylko przez przypadek. Może przestać działać w momencie rozpoczęcia korzystania z innego kompilatora lub nawet innej wersji tego samego kompilatora. To ** NIEPRZESTRZEGANE ZACHOWANIE **. Powodem, dla którego teraz działa, jest to, że gdy masz kod inicjalizacyjny w jednym z plików widżetu, kompilator ** dzieje się **, aby najpierw zainicjować twoje zasoby. Szczęście, nic więcej. Jeśli nie chcesz, aby twój program działał 0% jeden słoneczny dzień, postępuj zgodnie z instrukcjami, aby uniknąć * statycznego niepowodzenia inicjalizacji *. –
Czy porządek inicjalizacji statycznej jest zdefiniowany przez kompilator w fazie kompilacji, czy kolejność może zmieniać się między programami uruchamiającymi się ponownie (bez ponownej kompilacji)? – cybevnm