[Linux]共有ライブラリが見つからない時にやること

プログラムが実行できない。ライブラリが見つからない!

プログラムを実行するとなにやらエラーが!
なになに.. どうやら「libhogehoge.so.2」という共有ライブラリが見つかんないようだ。

$ ./server
$ ./server: error while loading shared libraries: libhogehoge.so.2: cannot open shared object file: No such file or directory

はじめに確認すること

まずプログラムが必要とする共有ライブラリを 「ldd」コマンドを使って確認する。

$ ldd server
        linux-vdso.so.1 =>  (0x00007fffb21f1000)
        libhogehoge.so.2 => not found
        libboost_system.so.1.65.1 => /usr/local/lib/libboost_system.so.1.65.1 (0x00007f59aaaf1000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f59aa8ed000)

たしかに、「libhogehoge.so.2」が「not found」だ。
これを解決すれば動くようになりそう!
※まぁプログラム実行時のエラー内容からも分るが念のための確認ということで。

ファイルはあるか?

漢らしくfindコマンドでファイルを検索だ!

$find /usr -type f -name "libhogehoge*"

ここでファイルが無ければ yum なり コンパイルするなりでライブラリを入れることとなる。
ファイルがある場合はどうするか?

その場合、次に確認しないといけない点は
「バージョンが一致しているか」と「検索パスに含まれているか」だ!

バージョンが一致しているか

ライブラリは有志によりBUG修正や機能拡張が行われているためバージョンによっては互換性がないものもある。そのためプログラム実行時には、そのプログラムが作成された時に使われたライブラリと互換性のあるライブラリが必要となる。

ただ、BUG修正などでライブラリのバージョン番号は頻繁に上がっている。それを一致させる事は非常に難しい。ではどうすればよいか?バージョンは「メジャー番号」と「マイナー番号」に別れ、互換性が失われる場合に「メジャー番号」を繰り上げるルールとなっている。つまり、「メジャー番号」が一致させると良い事になる!

先ほど、ファイルが見つかったがライブラリが読み込まれていない場合、このバージョン番号不一致ではないだろうか?「libhogehoge.so.2」を必要としているが「libhogehoge.so.1」があるだけで「libhogehoge.so.2」がないのではないか?

その場合は、プログラムが必要とするメジャーバージョンのライブラリを yum なり コンパイルなりで入れる必要がある。

ファイルが存在する場合は、次に「検索パス」を調査だ。

検索パスの設定

/lib(64) や /usr/lib(64) 以外の場所でライブラリが見つかった場合、ライブラリを検索するパスでない可能性が高い。たとえば、/usr/local/lib64 でファイルが見つかった場合、以下のコマンドを実行して ldd コマンドを試してみよう。

$expor LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64

これはライブラリを検索するパスを設定する環境変数となり、この配下に格納されているライブラリがプログラム実行時の検索対象となる。この設定でファイルが見つかれば、起動スクリプト内で設定してあげると良い。なおシステム全体に設定を反映する場合は、「/etc/ld.so.conf」に記載してあげよう。

それでも見つからない場合

私のスキルではこれ以上の対策は思いつきません!
こういうことも確認すれば良いよ? みないな事があれば是非教えてください!

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.