自分でコンパイルしたソフトウェアを使おうとしたときに動的ライブラリ・共有ライブラリ(〜.so、〜.a)が見つからないというエラーがでる。たとえば、以下のようなもの。
(前略): error while loading shared libraries: ****.so: cannot open shared object file: No such file or directory
状況を確認する
lddを用いて、どんな動的ライブラリ・共有ライブラリとリンクしているのかを確認する。動かしたいコマンド(実行ファイル)をhogetoolとしたとき以下のようにコマンドをうつ。
% ldd hogetool
gnome-terminalの場合
% which gnome-terminal /usr/bin/gnome-terminal % ldd /usr/bin/gnome-terminal linux-gate.so.1 => (0x00cb2000) libvte2_90.so.9 => /usr/lib/libvte2_90.so.9 (0x006a2000) libgconf-2.so.4 => /usr/lib/libgconf-2.so.4 (0x00dd9000) liblaunchpad-integration-3.0.so.1 => /usr/lib/liblaunchpad-integration-3.0.so.1 (0x00574000) 〜中略〜 libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0x00cb3000) libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0x00bdd000) libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0x00be1000)
このとき、「ライブラリー名」 => 「どこにあるか(絶対パス)」で表現される。右辺がないものがリンクが存在しないということ。
ライブラリーを探す
基本的に /hogehoge/lib と lib という名称のディレクトリにおいておくのがUnixの慣習。〜/lib を探す。力任せにいくならfindを使う
% find 検索開始ディレクトリ -name "欲しいライブラリー名"
/usr/local 以下にある libXdmcp.so.6 を探すならば
% find /usr/local -name "libXdmcp.so.6"
locateがインストール済みならば、locateで探す。
% locate 探したいファイル名
libXdmcp.so.6を探すならば
% locate libXdmcp.so.6
いくら探してもそのファイルが存在しないならば、未インストールの可能性がある。その動的・共有ライブラリを含むはずのソフトウェアをインストールする。自分でコンパイルする場合は--shared オプションをつけてコンパイルすること。パッケージシステムを使うならば「libほげほげ」という名前のパッケージを探す。UbuntuやDebianならば
% aptitude search 欲しいソフトウェア名やキーワード | grep lib
root権限が使える場合、かつ、最近のLinuxの場合
ldconfig を用いて、検索パスを通す。Ubuntu 11.10の場合 /etc/ld.so.conf.d 以下におかれている〜.confに記載されているディレクトリを探しに行く。
現在の参照ディレクトリ一覧をみる場合。
% /sbin/ldconfig -p
たとえば、/opt/intel/lib/intel64 にパスを通したい場合は /etc/ld.so.conf.d/intelcpp.conf を作成し、中身を以下のようにする。
/opt/intel/lib/intel64
反映させる。
% sudo /sbin/ldconfig
ちゃんとパスが通っているかを確認。
% /sbin/ldconfig -p | grep /opt/intel