実行時に共有ライブラリにリンクするプロセスを実行すると(プロセスの開始時にリンクされ、後で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
この完全なパスビジネスは、マルチアーチと呼ばれるものに関連しています。基本的に、同じシステム上で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.