プラグインを C++ Linux プログラムにロードするためのベスト プラクティスは何かについて、誰かが光を当てることができますか?
プラグイン (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=all を使用すると、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 で簡単に処理できますが、どちらのソリューションも汚いと感じます。
プラグインと依存関係の両方をロードするクリーンな方法はありますか? どうやってこれをやっていますか?