ロード可能なプラグインをバンドルとして作成し、ホスト実行可能ファイルでシンボルを使用することは、Mac に非常に適しています。Linux と Windows でこれを行うにはどうすればよいですか?
-rdynamic
便利なLinuxがあると聞きましたが、Windowsに関しては完全に途方に暮れています。
ポイントは、共有ライブラリに対してホストとプラグインの両方をリンクすることから離れて、静的に構築されたホストに移行することです。
ロード可能なプラグインをバンドルとして作成し、ホスト実行可能ファイルでシンボルを使用することは、Mac に非常に適しています。Linux と Windows でこれを行うにはどうすればよいですか?
-rdynamic
便利なLinuxがあると聞きましたが、Windowsに関しては完全に途方に暮れています。
ポイントは、共有ライブラリに対してホストとプラグインの両方をリンクすることから離れて、静的に構築されたホストに移行することです。
私がよく目にするプラグイン モデルは、プラグインで初期化関数を呼び出し、ホスト実行可能ファイルに関数ポインターを含む構造体またはクラスを渡します。
このリンクはおそらくここでも解決策です: dlopen() .so fails to find symbols in a stripped executable
主なアイデアは、実行可能ファイルにリンカー オプション -E (--export-dynamic) を使用することです (または、--dynamic-list を使用して、DSO がアクセスできるシンボルに明示的に名前を付けます)。
どうやらこれを達成する方法はありますが、ホスト実行可能ファイルへのハードコードされた依存関係に依存しています。
Windows では、わずかに異なるモデルを使用することをお勧めします。クロス プラットフォーム フレームワークを使用している場合は、これを IFDEF できるはずです。
LoadLibrary 関数を使用すると、DLL の名前を文字列として渡すことができます。次に、ライブラリ内のさまざまな関数のアドレスを名前で取得し、それらを関数ポインターでポイントできます。
私が理解していることを確認するために、ホスト アプリケーションでのみ定義されているシンボルを自動的に解決するプラグイン DLL を動的にロードおよびアンロードできるようにしたいと考えていますよね? これは Windows では不可能だと思います (Linux については知りません)。1 つのオプションは、ホスト関数を、全員がリンクする共有静的ライブラリに移動することですが、ホスト固有の機能を提供する必要があるため、これはおそらく不可能です。実行可能な唯一のオプションは、ザンのアプローチだと思います。