web-dev-qa-db-ja.com

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

実行時に共有ライブラリにリンクするプロセスを実行すると(プロセスの開始時にリンクされ、後で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

面白いことに、が機能しない作業はnewerバージョンです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
23
Dave Lillethun

この完全なパスビジネスは、マルチアーチと呼ばれるものに関連しています。基本的に、同じシステム上で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.
27
Matt H