静的ライブラリに埋め込まれqtのリソースを初期化します
-
21-09-2019 - |
質問
私は次のような状況を持っている:私は、最終的なアプリケーション(のVisual C ++ 9.0、4.5 QT)とリンクされるスタンドアロンの静的ライブラリ、ウィジェットを作成する必要があります。 ライブラリウィジェットこの静的にはいくつかのリソース(アイコン)を含み、いくつかの.cppファイル(各スタンドアロンのウィジェットが含まれている)で構成されています。私は「Q_INIT_RESOURCE(resource_file_name)」を呼び出して、静的ライブラリでそれら(リソース)を使用する場合私の知る限りでは、私は、QT資源システムを初期化する必要があります。
:私は(静的ライブラリ内のすべての.cppファイル内)の次のコードでこれを解決しました
#include <QAbstractButton>
namespace {
struct StaticLibInitializer
{
StaticLibInitializer()
{
Q_INIT_RESOURCE(qtwidgets_custom_resources);
}
};
StaticLibInitializer staticLibInitializer;
}
// ... widget code ....
の代わりに私の最初のアプローチの、私は(すべての.cppファイル内の初期化コードを含む避けるために)初期化コードを静的ライブラリプロジェクトにおける個別のinit.cppファイルを作成しているが、これは仕事をしませんでした。
これは仕事をしなかった理由?
StaticLibInitializerと、このアプローチは、様々なコンパイラやプラットフォーム間で、安全かつポータブルですか?
解決
これは動作しませんでした大失敗する
。あなたは静的オブジェクトはこれらの静的オブジェクトが使用されている翻訳単位を(ソースファイルとしてそれを読むことができます)特大初期化コードを移動することはできません。あなたはそれをしなかった方法。あなたがあなたのinit.hppヘッダが、休暇実体化への移行のみ宣言よりもこれらの静的オブジェクトを初期化するために使用されているスキームを使用する場合は、静的オブジェクトを使用する各ファイルにStaticLibInitializer staticLibInitializer;
。
アドバイスの上に、各ウィジェットは唯一、独自のリソースを使用を前提としています。あなたは1つのウィジェットのリソースが他のウィジェットで使用される状況を持っている場合は、大失敗再び静的初期化順序に実行します。あなたはこのようなコードを使用することによって、このような状況を管理することができます。
StaticLibInitializer
{
void initialize()
{
static Q_INIT_RESOURCE(qtwidgets_custom_resources);
}
StaticLibInitializer()
{
initialize();
}
}
StaticLibInitializerの確認乗算インスタンスが指定した翻訳単位で使用しようとしているすべてのリソースに対して一度だけして、インスタンス化StaticLibInitializer与えられたリソースを初期化します作るために。
他のヒント
Q_INIT_RESOURCEマクロが名前空間で使用することができない。
私はQTマニュアルから引用してみましょう:「注:このマクロは、名前空間で使用することはできませんそれは(メインから呼び出される必要があります)」。でもそれは、これが不可能な場合は、右のそれを行う方法をあなたに例を示します:
inline void initMyResource() { Q_INIT_RESOURCE(myapp); }
namespace MyNamespace
{
...
void myFunction()
{
initMyResource();
}
}
なぜ、どのように正確にそれが失敗したり、不特定の方法でそれを使用する場合、失敗しない自分を見てください。関連するコードはQtCoreである。