問題はdlopen
、ライブラリをロードするために使用することです (.so は私が作成したもので、システム ライブラリではありません) が、タイトルに示されているエラーが発生しました。
- 含めました
dlfcn.h
- コンパイラでは、
-ldl
コマンドを使用しました - ロードしたいのはソースコードフォルダだけで、追加しようとしまし
-L.
たが、うまくいきませんでした。
問題はdlopen
、ライブラリをロードするために使用することです (.so は私が作成したもので、システム ライブラリではありません) が、タイトルに示されているエラーが発生しました。
dlfcn.h
-ldl
コマンドを使用しました-L.
たが、うまくいきませんでした。dlopen するライブラリが標準の検索パスにない場合は、いくつかのオプションがあります。
dlopenにファイルへのフルパスを指定
dlopen("/full/path/to/libfile.so");
LD_LIBRARY_PATH 経由でライブラリへのパスを追加します
LD_LIBRARY_PATH=/path/to/library/ ./executable
ld -rpath オプションを使用して、ライブラリ パスをアプリケーションに追加します。
g++ -link stuff- -Wl,-rpath=/path/to/library/
オプション 1 と 3 は、ライブラリ パスをアプリケーションにハードコーディングすることに注意してください。-rpath には、相対パスを指定するオプションがあります。
-Wl,-rpath=$ORIGIN/../lib/
アプリケーションに相対パスを埋め込みます。
dlopenの宣言は次のようになります。void*dlopen(const char * filename、int flag);
パラ「ファイル名」を共有ライブラリの名前として設定する場合は、現在のパスを「LD_LIBRARY_PATH」に追加する必要があります。たとえば、
1、dlopen( "libtest.so"、RTLD_LAZY)
2、シェルで、LD_LIBRARY_PATH = .:$LD_LIBRARY_PATHをエクスポートします
私の場合、解決策は非常に簡単でした:
相対パスとして明確に指定されていない限り、パスは絶対パスであることが期待されます
なので交換しました
dlopen("mylib.so", RTLD_NOW)
と
dlopen("./mylib.so", RTLD_NOW)
そして、問題は解決しました。