動的ライブラリ・共有ライブラリのリンクミスへの対応

自分でコンパイルしたソフトウェアを使おうとしたときに動的ライブラリ・共有ライブラリ(〜.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ほげほげ」という名前のパッケージを探す。UbuntuDebianならば

% 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

root権限が使える場合、かつ、Solaris(ldconfigが使えない or 悪影響がある)

ldconfig -p で現在パスがとおっているディレクトリを探し、シンボリックリンクをそのディレクトリからはる。

% sudo ln -s /usr/local/hogehoge/fugafuga/lib/libhogehoge.so /usr/local/lib

あるいは当該ソフトウェアのコンパイル時にちゃんとLD_LIBRARY_PATHを記述したり、-Lオプションを使ったり、--with-hogehoge=hogehogeがインストールされているディレクトリとする。