プログラムが実行できない。ライブラリが見つからない!
プログラムを実行するとなにやらエラーが!
なになに.. どうやら「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修正や機能拡張が行われているためバージョンによっては互換性がないものもある。そのためプログラム実行時には、そのプログラムが作成された時に使われたライブラリと互換性のあるライブラリが必要となる。
ただ、バグ修正などでライブラリのバージョン番号は頻繁に上がっている。それを一致させる事は非常に難しい。ではどうすればよいか?バージョンは「メジャー番号」と「マイナー番号」に別れ、互換性が失われる場合に「メジャー番号」を繰り上げるルールとなっている。つまり、バージョンを完全一致させるのではなく、「メジャー番号」だけが同じであれば良いこととなる。
先ほど、ファイルが見つかったがライブラリが読み込まれていない場合、このバージョン番号不一致ではないだろうか?「libhogehoge.so.2」を必要としているが「libhogehoge.so.1」があるだけで「libhogehoge.so.2」がないのではないか?
その場合は、プログラムが必要とするメジャーバージョンのライブラリを yum なり コンパイルなりで入れる必要がある。
ファイルが存在する場合は、次に「検索パス」を調査だ。
検索パスの設定
プログラムを実行すると、一般的にそれに必要なライブラリを自動的に /lib(64) や /usr/lib(64) 配下から見つける。 つまり以外の場所でライブラリが見つかった場合、ライブラリの検索場所でない可能性が高い。たとえば、/usr/local/lib64 でファイルが見つかった場合、以下のコマンドを実行して ldd コマンドを試してみよう。
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
これはライブラリを検索するパスを設定する環境変数となり、この配下に格納されているライブラリがプログラム実行時の検索対象となる。この設定でファイルが見つかれば、起動スクリプト内で設定してあげると良い。なおシステム全体に設定を反映する場合は、「/etc/ld.so.conf」に記載してあげよう。
それでも見つからない場合
私のスキルではこれ以上の対策は思いつきません!
こういうことも確認すれば良いよ? みないな事があれば是非教えてください!