Ubuntuは共有ライブラリをどこで探しますか?


24

実行時に共有ライブラリにリンクするプロセスを実行すると(プロセスの開始時にリンクされ、後でリンクされませんdlload())、.soそれ以外の共有ライブラリ()ファイルはどこで検索されますLD_LIBRARY_PATHか?

バックグラウンド:

特定のサードパーティライブラリを使用するC ++コードをいくつか作成しました。ライブラリをインストールし、コードを2つの異なるプラットフォーム(Ubuntuが異なるバージョン、および異なるバージョンのgccの両方)でコンパイルしました。ライブラリはソースからコンパイルおよびインストールされ/usr/local/lib、両方のプラットフォームにあります。コードをコンパイルするときにpkg-config --libs、サードパーティライブラリのパラメーターとリンクし、pkg-config --libs両方のプラットフォームでまったく同じものが返されることを確認しました。

私のコードは両方のプラットフォームで正常にコンパイルされ、両方のプラットフォームでLD_LIBRARY_PATH定義されていません(または空として定義されています"")。ただし、一方のプラットフォームで実行すると正常に動作し、他方ではこのエラーが発生します:

error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory

Funnily十分で、もののない作業があり、新しい Ubuntuとのgccのバージョン。:/

だから私は、壊れた人が同じ方法でライブラリを見つけることができるように、作業中の人がどのようにライブラリを見つけることができるかを理解しようとしています。(つまり、設定なしLD_LIBRARY_PATH

更新:

ここからの私の出力です cat /etc/ld.so.conf.d/*

...動作している(古い)システム上:

/usr/lib/mesa
/usr/lib32/mesa
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

...壊れた(新しい)システムで:

# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/mesa

1
これらの場所はで定義されていると思います/etc/ld.so.conf.d/*.confが、私にはわかりません。
セーラム

そのように見えますが、それらのファイルの内容についてはOQの更新を参照してください...だから、それは見つけるはずですが/usr/local/lib/libthrift-0.9.0.so、それでもエラーが発生しますerror while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory... ディレクトリを取得しない理由はあります/etc/ld.so.conf.d/*.confか?
デイブリレサン

3
sudo ldconfig -v以下に示すように実行してみてください。それでも動作しない場合は、質問をの出力で更新してくださいldd /path/to/your/application
セーラム

回答:


29

この完全なパスビジネスは、マルチアーチと呼ばれるものに関連しています。基本的には、同じシステム上で32ビットと64ビットのライブラリを使用できるようにすることです。

ファイルをコピーした後、ldconfigを実行しましたか?

ldconfig  creates,  updates,  and removes the necessary links and cache
       (for use by the run-time linker,  ld.so)  to  the  most  recent  shared
       libraries  found  in  the directories specified on the command line, in
       the file /etc/ld.so.conf, and in the trusted directories (/usr/lib  and
       /lib).   ldconfig  checks the header and file names of the libraries it
       encounters when determining which  versions  should  have  their  links
       updated.  ldconfig ignores symbolic links when scanning for libraries.

私は走りましたsudo ldconfig、そしてそれは問題を修正しました!(コードなどを再コンパイルする必要はありませんでした...)理解したいのですが...あなたは「ファイルをコピーした後」と言いましたが、ファイルをコピーしませんでした。ライブラリをビルドしてインストールした後、またはプログラムをコンパイルした後ですか?
デイブリレサン

配置した場所に配置した後。基本的に、ライブラリキャッシュが構築されます。再起動するとキャッシュも再構築されると思います。
マットH

間違っているかもしれませんが、ライブラリをインストールしてから再起動したと思います...しかし、sudo ldconfigトリックをしました。これは、インストールの一部としてライブラリが自動的に実行されることが多いのでしょうか。これは何らかの理由で実行されませんでしたか?...ただ、私は「通常」この操作を行う必要はありませんなぜ疑問に思ったが、この場合にのみでした
デイブLillethun

通常、パッケージのインストールでは、インストールプロセス中にldconfigが実行されます。新しいディストリビューションのバージョンが何らかの理由で実行していない可能性があります。
マットH

1

上記の質問に含まれる情報と最初の(そしてATTのみの)回答はWSL Ubuntu(Win10 64上)での私の*同様の*問題を解決するのに役立ちました!

私の場合、実行可能ファイルはライブラリを見つけることができませんでした。私は最終的に新しく作られたライブラリーが中に配置しまったことに気づいた/usr/lib64しかしのマルチアーチラインが/etc/ld.so.conf.d/x86_64-linux-gnu.conf なかったではない、そのディレクトリが含まれます。

だから私は走った

sudo ldconfig /usr/lib64

そしてそれは最終的にそれを修正しました。(ディレクトリパラメータなしで単独で実行しても、ライブラリが「魔法のように」検索されるわけではありませんでした。)WSL bashを「再起動」すること助けになったかどうかは不明です。


/ usr / local / lib /でも同じことが起こりました。私は、ファイルを作成/etc/ld.so.conf.d/usr-local.confしてから走っsudo ldconfig効果なしで-そのディレクトリ内のライブラリは、ローダによって見つかりませんでした。実行後、sudo ldconfig /usr/local/libすべてが正常に機能しました。
ジョシュミルソープ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.