プラグインをC++ Linuxプログラムにロードするためのベストプラクティスは何ですか?プラグインを使用したC++プログラムのベストプラクティス
プラグイン(libsyntax.so)を持つプログラム(エディタ)があるとします。エディタの設定ファイルには、libsyntax.soライブラリ(plugin1 =/opt/editor/gizmos/libsyntax.so)へのパスが含まれています。エディタは設定を読み込み、次のものを呼び出します。
void* library = dlopen(path, RTLD_NOW|RTLD_GLOBAL);
MYFUN* function = (MYFUN*)dlsym(library, "function");
すべては問題なく機能します。
ここで、(libsyntax.so)がヘルパーライブラリ(libcolor.so)に依存していると仮定しましょう。我々はreadelfが実行すると、我々が得る:
readelf -d libsyntax.so
Dynamic section at offset 0x12b6b48 contains 31 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libcolor.so]
...
しかし、この時点で上記のdlopen()は失敗し、エラーは、「そのようなファイルまたはディレクトリ」ではありません。 LD_DEBUGを使用する=すべてが明らかにlibsyntax.soがロードされた後、メッセージがあること:
28664: file=libcolor.so [0]; needed by /home/.../libsyntax.so [0]
28664: find library=libcolor.so [0]; searching
28664: search cache=/etc/ld.so.cache
28664: search path=/lib64/tls/x86_64:/lib64/tls:...:/usr/lib64 (system search path)
28664: trying file=/lib64/tls/x86_64/libcolor.so
... and so on
ローダ/リンカは、私の依存関係を見つけることではない、明らかに、標準の場所で見ているとされます。これはldconfigやLD_LIBRARY_PATHによって簡単に処理できますが、どちらの解決策も汚いと感じます。
プラグインと依存関係の両方を読み込む明確な方法はありますか?どのようにこれをやっている?
私はRPATHとRUNPATHを避けることを望んでいました。とにかくRPATHは廃止されるはずです。 – JurekM
IIRCの場合、 '$ ORIGIN'はシェルクォートでなければなりません。 –
'libsyntax.so'をリンクするときに、オプション' -Wl、-rpath、/ path1/path2'(libcolor.soが実際にあるパス)を使用します。 –