Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
39
Help us understand the problem. What is going on with this article?
@kouyan

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

More than 1 year has passed since last update.

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

プログラムを実行するとなにやらエラーが!
なになに.. どうやら「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」に記載してあげよう。

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

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

39
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kouyan
おっさんプログラマー

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
39
Help us understand the problem. What is going on with this article?