スタティックライブラリの一部として、非常に基本的な「プラグインシステム」を実装しました。各「プラグイン」は、特定の画像フォーマット(例えば、 GIF、JPEGなど。また、利用可能なすべてのプラグインのリストを保持するシングルトン(PluginManager
というクラス)があります。スタティックライブラリのオブジェクト登録
難しいのは、プロジェクトファイルにソースファイルを追加または削除してプラグインを無効/有効にしたいということです。これを実現するために、各プラグインはグローバル変数(名前が異なる)を作成し、そのクラスのコンストラクターにあるプラグインをPluginManager
に登録します。これは理論的には完璧に動作しながら、他のコードに、この静的ライブラリをリンクする際
JPEG形式のため、このような何か...
struct JPEGPlugin
{
// constructor will register plugin
JPEGPlugin()
{
PluginManager::Singleton().RegisterPlugin(this);
}
// plenty of other code
...
};
JPEGPlugin jpeg_instance; // instantiate in global scope
はしかし、それは実行可能ファイルを構築するために失敗しました。この実行可能ファイルが(jpeg_instance
のような)プラグインのグローバルにアクセスしない限り、リンカは接続を認識せず(コンストラクタの副作用を完全に無視します)、最終実行可能ファイルにコードを含めません。つまり、最終的なアプリケーションではJPEGプラグインは使用できません。
私は何年にもわたって数回問題に遭遇しましたが、私はいつも解決のためネットを検索しました。たびに、私はちょうどそれが既知の問題であり、私はそれと一緒に暮らさなければならないと基本的に言うページを見つけました。
しかし、おそらく誰かがこれを動作させる方法を知っていますか?
OK、編集に気付きました。 :) –