web-dev-qa-db-ja.com

ライブラリファイル(* .so)はどのようにして共有依存関係を解決しますか?

次のコマンドを呼び出すと:

_ldd mylib.so
_

これにより、次の線に沿って何かが生成されます。

_libopencv_features2d.so.4.1 => /usr/local/lib/libopencv_features2d.so.4.1 (0x00007f83dee6b000)
_

_/usr/local/lib/libopencv_features2d.so.4.1_を現在の作業ディレクトリにコピーすると、lddに=> ./libopencv_features2d.so.4.1 (0x00007f83dee6b000)が表示されると予想されます。

代わりに、それでも_/usr/local/lib_に解決されます。何故ですか?そして、このようなシステムの依存関係はどのように解決されますか?依存関係の解決方法に影響を与える方法もありますか?ローカルディレクトリに解決するように強制できますか?

2
netbrain

ダイナミックリンカはさまざまな場所でライブラリを検索しますが、デフォルトでは現在のディレクトリは含まれていません。 Linuxの場合、 リストは

  • バイナリのrpathで定義されているパス(存在する場合)。
  • LD_LIBRARY_PATHにリストされているパス(ある場合)。
  • バイナリの実行パスで定義されているパス(存在する場合)。
  • /etc/ld.so.cacheで知られているライブラリ。
  • システムのライブラリパス(/usr/libなど)。

上記のリンクで詳細を確認できます。

LD_LIBRARY_PATHをエクスポートすることで、依存関係の解決方法に影響を与えることができます。特にあなたの場合:

export LD_LIBRARY_PATH=.

(その値に設定したままにしないでください。)

4
Stephen Kitt