我有下一種情況:我需要在獨立靜態庫中創建小部件,然後將它與最終應用程序(visual C++ 9.0,qt 4.5)鏈接。 這個靜態小部件庫包含一些資源(圖標),並由幾個.cpp文件(每個包含獨立小部件)組成。據我所知,我必須初始化qt資源系統,如果我在靜態庫中使用它們(資源),並調用「Q_INIT_RESOURCE(resource_file_name)」。我解決了這個用下面的代碼(在靜態庫中的每個.cpp文件):初始化靜態庫中嵌入的qt資源
#include <QAbstractButton>
namespace {
struct StaticLibInitializer
{
StaticLibInitializer()
{
Q_INIT_RESOURCE(qtwidgets_custom_resources);
}
};
StaticLibInitializer staticLibInitializer;
}
// ... widget code ....
而不是我的第一個方法,我已經創建單獨的init.cpp文件中的靜態庫項目與初始化代碼(以避免包括初始化代碼在每個.cpp文件中),但是這不起作用。
爲什麼這不起作用?
StaticLibInitializer的這種方法在各種編譯器和平臺之間是安全可移植的嗎?
在我目前的情況下,我有三個.cpp文件(每個文件都實現了它自己的小部件,其中兩個使用.qrc文件中的資源),但是初始化代碼,我在原始問題中只給出了其中的一個,罰款(100%,而不是50/50)。所以我不明白,爲什麼當我把初始化代碼放在單獨的init中。cpp文件我無法使用我的資源,但是當這個代碼在一個小部件的.cpp文件中都可以正常工作時... – cybevnm 2009-09-15 08:36:40
它沒關係,它現在工作正常**現在** :)它僅在偶然情況下才有效。當你開始使用另一個編譯器甚至是同一個編譯器的另一個版本時,它可能會停止工作。它是**未定義的行爲**。現在它的工作原因是因爲當你在其中一個小部件的文件中有初始化代碼時,編譯器**發生**首先初始化你的資源。純粹的運氣,沒有更多。如果你不想讓你的程序工作0%,一個陽光燦爛的日子按照指示,以避免*靜態初始化順序失敗*。 – 2009-09-15 12:45:34
在編譯階段是由編譯器定義的靜態初始化順序,還是順序可能會在程序重新啓動(不重新編譯)之間變化? – cybevnm 2009-09-15 13:19:49