1

dlopenLinuxで共有ライブラリを呼び出すために使用することに興味があります。という名前の共有ライブラリを C で使用したいとしますfileName.so。私は64ビットのUbuntu Linuxで作業しており、関数を含めdlfcn.hて使用dlopenして共有ライブラリにアクセスしています。

を使用するdlopen(fileName.so, RTLD_LAZY)と、NULL ハンドルが返され、共有ライブラリが開かれません。ただし、使用するdlopen("./fileName.so", RTLD_LAZY)と、dlopenその仕事が行われ、共有ライブラリが開きます。./ファイル名の前に使うのがポイントのようです。

コードで使用する理由を理解するのに役立ち./ます。ありがとう

4

3 に答える 3

5

POSIXはdlopen()、ファイルを探す場所を知る必要があり、ファイル名に/実装が定義されていない場合の動作をそのままにしておく必要があると述べています。Linux では、パス名 (/どこかに が含まれる名前)を指定しない場合dlopen()、LD_LIBRARY_PATH などの環境変数または via /etc/ld.so.conf(または/etc/ld.so.cache; も参照ldconfig(8))で指定された「標準的な場所」、または次のような標準的な場所のみを検索します。として/lib/usr/lib

相対名を指定する./fileName.soと、現在のディレクトリを検索することが認識されますが、これは通常、検索する場所ではありません。

32 ビットと 64 ビットの両方の実行可能ファイルをサポートするシステムでは、ライブラリのさまざまなクラスの場所にさまざまな規則が使用されているため、いくつかの興味深い問題が発生する可能性があることに注意してください。Unix の他の変種は、あいまいに関連するシステムを使用しています —dlopen()最近は主に et al を使用し (歴史的に、常にそうであったわけではありません)、さまざまな環境変数 (DYLD_LIBRARY_PATH、LIBPATH、SHLIB_PATH、LD_RUN_PATH、LD_LIBRARY_PATH_32、LD_LIBRARY_PATH_64、...) を使用しています。 .

于 2013-02-04T05:55:16.397 に答える
1

./.soファイルへの相対パスです。これは、ファイルが現在のディレクトリにあることを意味します。

*nix では、デフォルトで、絶対パスまたは相対パスなしでファイル名を指定すると、デフォルトの場所のセット リストでdlopenライブラリが検索されます。

于 2013-02-04T05:55:39.017 に答える