静的ライブラリの一部として、非常に基本的な「プラグインシステム」を実装しました。各「プラグイン」は、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プラグインは最終的なアプリでは使用できません。
私は何年にもわたって何度か問題に遭遇し、常にネットで解決策を探しました。毎回、それは既知の問題であり、私はそれと一緒に暮らさなければならないと基本的に言っているページを見つけました。
しかし、おそらくSOの誰かがこれを機能させる方法を知っていますか?
