環境
- Ubuntu Linux 20.04 (AWS)
用語
- 本記事では「共通ライブラリ = shared object file = soファイル = *.so」 としている
トラブル
- shared libraries のパスを設定しているにも関わらず、ライブラリがみつからないという旨のエラーが発生
- 以下、エラーメッセージ(アプリケーションに依存したメッセージかもしれない)
error while loading shared libraries: *.so: cannot open shared object file: No such file or directory
Ubuntu が shared libraries を探すパスの確認方法
- パスの一覧を以下のコマンドで確認
cat /etc/ld.so.conf.d/*
- 以下は実行結果
-
/etc/ld.so.conf.d/
に、共通ライブラリのパスを書いたconfファイルを保存する仕組みのようだ - アプリは、このフォルダ内にあるconfファイルに書かれたパスをもとに soファイルを探すというようになる
# libc default configuration
/usr/local/lib
# Multiarch support
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
Ubuntu が shared libraries を探すパスの設定方法
- 新規にパスを書いた
conf
ファイルを作成
vim /etc/ld.so.conf.d/additive_path.conf
- 以下は、ファイルの内容
/etc/ld.so.conf.d/additive_path.conf
/usr/lib64
トラブル(再確認)
-
additive_path.conf
に*.so
があるパスを書いて保存しているにも関わらず、*.soファイルがないというエラーが発生
解決方法
- 以下のコマンドを実行
- shared libraries のパスが反映されて、Ubuntuがライブラリを発見することができた
- キャッシュが効くかもしれないので再起動が必要かもしれない、とのこと(筆者の環境では、再起動しても反映されず、
ldconfig
実行直後にパスが反映された
sudo ldconfig
理由
- 32ビットと64ビットのアーキテクチャを1つのシステムで実現できるようにしていて、それを実現するために
ldconfig
コマンドを実行する必要がある、ということのようだ(よくわかっていない)
付録
- 以下の環境変数でも、ライブラリのパスを設定できる
export LD_LIBRARY_PATH=/usr/lib64
-
LD
は、LOAD
またはLOADER
の略のようだ
参考