19 July 2008

makeするとライブラリが入っているのに /usr/lib/ld: cannot find と怒られる問題

make中に、こんなエラーが出ることがあります。

/usr/lib/ld: cannot find -lfoo

こんな風にlibfooというライブラリが見つからないと言ってきます。

そこで、ほんとに入っていないのか調べてみます。

$ ldconfig -p | grep libfoo

これで、本当にそのライブラリが入っていなかった場合は、インストールしてください。ただ、ライブラリが入っているのに上記のように怒られてしまうことが結構あります。

原因として、シンボリックリンクがきちんと張られていないというパターンが多いです。たとえば、libfoo.soというライブラリが2度バージョンアップして、libfoo.so.6とlibfoo.so.6.2があるとします。ふつうは互換性のため、

libfoo.so -> libfoo.so.6.2
libfoo.so.6 -> libfoo.so.6.2

という風に、古いファイル名からのリンクが張ってあると思います。でも、どうもこれがうまくできていないときがあります。たとえばこんな感じです。

$ ls -l /usr/lib/*foo*
lrwxrwxrwx 1 root root    15 2008-00-00 00:00 libfoo.so.6 -> libfoo.so.6.2
-rw-r--r-- 1 root root 98765 2008-00-00 00:00 libfoo.so.6.2

libfoo.so.6.2からlibfoo.soへのリンクが張られてないですね。(RPMのせい?)。こんなときに、最初のような、ライブラリが見つからないよというエラーが出ることがあります。

$ sudo ln -s /usr/lib/libfoo.so.6.2 /usr/lib/libfoo.so

こうやってリンクを張ってあげれば解決です。

64bitのマシンを使っている人は、/usr/lib/のほうが大丈夫でも、/usr/lib64/のほうでうまくリンクできていないこともあるので、そっちを疑ってみるのも良いでしょう。