9

問題はdlopen、ライブラリをロードするために使用することです (.so は私が作成したもので、システム ライブラリではありません) が、タイトルに示されているエラーが発生しました。

  1. 含めましたdlfcn.h
  2. コンパイラでは、-ldlコマンドを使用しました
  3. ロードしたいのはソースコードフォルダだけで、追加しようとしまし-L.たが、うまくいきませんでした。
4

5 に答える 5

9

dlopen するライブラリが標準の検索パスにない場合は、いくつかのオプションがあります。

  1. dlopenにファイルへのフルパスを指定

    dlopen("/full/path/to/libfile.so");

  2. LD_LIBRARY_PATH 経由でライブラリへのパスを追加します

    LD_LIBRARY_PATH=/path/to/library/ ./executable

  3. ld -rpath オプションを使用して、ライブラリ パスをアプリケーションに追加します。

    g++ -link stuff- -Wl,-rpath=/path/to/library/

オプション 1 と 3 は、ライブラリ パスをアプリケーションにハードコーディングすることに注意してください。-rpath には、相対パスを指定するオプションがあります。

-Wl,-rpath=$ORIGIN/../lib/

アプリケーションに相対パスを埋め込みます。

于 2012-10-12T02:07:38.760 に答える
2

dlopenの宣言は次のようになります。void*dlopen(const char * filename、int flag);

パラ「ファイル名」を共有ライブラリの名前として設定する場合は、現在のパスを「LD_LIBRARY_PATH」に追加する必要があります。たとえば、

1、dlopen( "libtest.so"、RTLD_LAZY)

2、シェルで、LD_LIBRARY_PATH = .:$LD_LIBRARY_PATHをエクスポートします

于 2012-10-12T02:10:07.217 に答える
0

私の場合、解決策は非常に簡単でした:

相対パスとして明確に指定されていない限り、パスは絶対パスであることが期待されます

なので交換しました

dlopen("mylib.so", RTLD_NOW)

dlopen("./mylib.so", RTLD_NOW)

そして、問題は解決しました。

于 2022-02-03T08:47:42.050 に答える