4

アプリケーション用のプラグインを書いています。アプリケーションは、を使用してプラグインをロードしますdlopen()。プラットフォームはFedoraLinux11です。アプリケーションのすべてのソースコードがあります。

コードをアプリケーションに正常に追加しましたが、アプリケーション全体が一度にリンクされていたため、正常にリンクされました。ただし、最終的には、コードを別のプラグインにしたいです。

プラグインとしてコードを作成するのに問題があります。共有(.so)ライブラリとして構築しています。私のコードは当然アプリケーション内のシンボルを参照しているため、プラグインがg++ -Land-lオプションを使用してリンクするライブラリを指定する必要があります。ただし、私のプラグインを受け入れるアプリケーションは、.soライブラリのセットではなく、単一の実行可能ファイルです。

ここでいくつかの基本的なポイントが欠けています。プラグインをリンクするにはどうすればよいですか?

私はまだプラグインをビルドしようとしていることに注意してください-私はまだプラグインを使用してロードしようとしているところまで来ていませんdlopen()

解決策:ご回答ありがとうございます。nemoによって提案された--just-symbolsメソッドを使用しましたが、うまく機能しました。ありがとう!

4

3 に答える 3

2

1 つの方法は、プラグインをシンボルに直接リンクさせないことです。dlopen() は、NULL のパスを使用して現在のプロセスを「ライブラリ」としてロードできますが、これには -rdynamic フラグを GCC で設定する必要があります。これはつまり、Glade がどのように機能するかです。コールバックをある種の XML ファイルに設定すると、「魔法のように」機能します。

別の方法として、一連の関数ポインターをプラグインに渡すことで、それらにリンクする必要がなくなります。もちろん、これにはプラグイン アーキテクチャがこの種のもの用に設計されている必要があります。

于 2011-05-31T20:47:00.480 に答える
1

リンカーに「-R」(別名「--just-symbols」)オプションが必要だと思います。

したがってmyexe、マスター実行可能ファイルの場合:

g++ -Wl,--just-symbols=myexe -L... -l... -shared -o plugin.so plugin.o

myexePSこれは、それ自体が とリンクされていることを前提としてい--export-dynamicます。そうしないと、エクスポートされないため、実行可能ファイル内のシンボルを .so で参照できません。

于 2011-05-31T20:49:02.850 に答える
1

アプリケーションはプラグインを使用するように設計されていますか? もしそうなら、私はそれがインターフェース(およびその欠如)の設計が不十分であると主張します. アプリケーションは、あなたのようなプラグインがリンク時の回避策やハックに頼ることなく活用できるライブラリを提供する必要があります。

于 2011-05-31T20:50:18.280 に答える