私は次の状況があります:スタンドアロンスタティックライブラリでウィジェットを作成し、最終アプリケーション(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でのこのアプローチは、さまざまなコンパイラやプラットフォーム間で安全で移植性がありますか?
私の現在の状況で私は3つの.cppファイルを持っています(それぞれは独自のウィジェットを実装していますが、そのうち2つは.qrcファイルのリソースを使用します)が、元の質問では、良い(100%、50/50ではない)。だから私は理解できません、なぜ私は別のinitに初期化コードを入れます。cppファイル私は自分のリソースを使用することはできませんが、ウィジェットの.cppファイルのいずれかにあるこのコードがすべてうまくいきます... – cybevnm
これは問題なく動作します** ** ** **)別のコンパイラーや同じコンパイラーの別のバージョンを使用して作業を開始すると、作業が停止する可能性があります。それは**定義されていない動作**です。その理由は、ウィジェットのファイルのいずれかに初期化コードがあると、まずコンパイルが行われ、リソースを最初に初期化するからです。純粋な運が、それ以上はありません。あなたのプログラムが晴れた日に0%働かないようにするには、静的な初期化の失敗を避けるための指示に従ってください。 –
コンパイル時にコンパイラによって静的初期化の順序が定義されているか、プログラム間で順序が変わることがあります(再コンパイルなし)。 – cybevnm