環境構築を行っていると以下のような、エラーに出会うことが多い
エラー:
error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
内容としては、なにかシステムがライブラリを必要としているが、そんなファイルやディレクトリは見つからないよ~といった旨のエラーとなっている。
足りないならインストールしてくるほかないが、ここで「sudo apt install libtinfo.so.5」のように無いよと言われているライブラリ名を直接指定すると、下のようになる。
結果:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package libtinfo.so.5
E: Couldn't find any package by glob 'libtinfo.so.5'
足りないと言われたライブラリを、言われた通りにそのままインストールしようとしたにも関わらず、そんな名前のものはみつからない!と言われてしまう。
Linux環境初心者的には、ここでどうすればいいか毎回分からなくなるので、aptでインストールしてくる対象となる、足りないライブラリを含むパッケージの見つけ方について、探し方のメモ
対象ライブラリを含むパッケージの見つけ方
aptの使えるUbuntu環境であれば「apt search」や「apt-cache search」コマンドを使うことで、おおよそ特定のライブラリを含むパッケージを見つけることができる。CentOSなどのパッケージ管理にyum用いる環境ではおそらく「yum search」などが同等のもの。
パケージの探し方の例1
先ほどの「libtinfo.so.5」を見つける方法を例に挙げると
コマンド:
$ apt search libtinfo
このようなライブラリ名の特徴的な一部を含むコマンドを用いることで「libtinfo」という文字を含むそれっぽいパッケージの一覧が以下のように表示される。また、「apt-cache search libtinfo」で探しても良い。
実行結果:
Sorting... Done
Full Text Search... Done
libtinfo-dev/jammy-updates,jammy-security 6.3-2ubuntu0.1 amd64
transitional package for libncurses-dev
libtinfo5/jammy-updates,jammy-security,now 6.3-2ubuntu0.1 amd64 [installed]
shared low-level terminfo library (legacy version)
libtinfo6/jammy-updates,jammy-security,now 6.3-2ubuntu0.1 amd64 [installed,automatic]
shared low-level terminfo library for terminal handling
この中で名前や説明的に、「libtinfo5」という名前のパッケージが「libtinfo.so.5」を含んでいそうだと見つけることができる。
ここまで絞り込んだあとは、経験上、それっぽいと思ったものが十中八九探しているパッケージだが、確実性を持たせたいときは、「apt show」コマンドなどを用いて各パッケージの詳細を見ることで内容を確認することができる。
コマンド:
$ apt show -a libtinfo5
結果:
Package: libtinfo5
Version: 6.3-2ubuntu0.1
Priority: optional
Section: universe/libs
Source: ncurses
Origin: Ubuntu
Maintainer: Ubuntu Developers
Original-Maintainer: Craig Small
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 557 kB
Depends: libc6 (>= 2.33)
Homepage: https://invisible-island.net/ncurses/
Download-Size: 100 kB
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages
Description: shared low-level terminfo library (legacy version)
The ncurses library routines are a terminal-independent method of
updating character screens with reasonable optimization.
.
This package contains the legacy version of the shared low-level
terminfo library.
Package: libtinfo5
Version: 6.3-2
Priority: optional
Section: universe/libs
Source: ncurses
Origin: Ubuntu
Maintainer: Ubuntu Developers
Original-Maintainer: Craig Small
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 553 kB
Depends: libc6 (>= 2.33)
Homepage: https://invisible-island.net/ncurses/
Download-Size: 99.2 kB
APT-Sources: http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages
Description: shared low-level terminfo library (legacy version)
The ncurses library routines are a terminal-independent method of
updating character screens with reasonable optimization.
.
This package contains the legacy version of the shared low-level
terminfo library.
ここで、パッケージの内容を精査してみるとどんなライブラリを含むのかなどを知ることができる。
最終的には、ここで見つかったパケージをいつものようにインストールする。
コマンド:
$ sudo apt install libtinfo5
これで、「/usr/lib/」以下や「/usr/lib/x86_64-linux-gnu/」以下にlibtinfo.so.5を見つけることができるようになり、「libtinfo.so.5」ファイルが見つからないといった旨のエラーは出なくなる。
エラーの出ていたアプリケーションの実行で、このような手順で足りないものをインストールしていくことで、少なくともライブラリの足りないと言われているようなエラーについては解決できるはずである。
パケージの探し方の例2
つぎに音声の入出力を行うようなアプリケーションに用いられる「portaudio」というライブラリを同じように探してみる。
コマンド:
$ apt search portaudio
結果:
Sorting... Done
Full Text Search... Done
baresip/jammy 1.0.0-4build4 all
portable and modular SIP user-agent - metapackage
baresip-core/jammy 1.0.0-4build4 amd64
portable and modular SIP user-agent - core parts
baresip-ffmpeg/jammy 1.0.0-4build4 amd64
portable and modular SIP user-agent - FFmpeg codecs and formats
baresip-gstreamer/jammy 1.0.0-4build4 amd64
portable and modular SIP user-agent - GStreamer pipelines
baresip-gtk/jammy 1.0.0-4build4 amd64
portable and modular SIP user-agent - GTK+ front-end
baresip-x11/jammy 1.0.0-4build4 amd64
portable and modular SIP user-agent - X11 features
hydrogen/jammy 1.1.1+52.gb917e057-1 amd64
advanced drum machine/step sequencer
libportaudio-ocaml/jammy 0.2.2-1build1 amd64
OCaml bindings for the portaudio library -- runtime files
libportaudio-ocaml-dev/jammy 0.2.2-1build1 amd64
OCaml bindings for the portaudio library -- development files
libportaudio2/jammy 19.6.0-1.1 amd64
Portable audio I/O - shared library
libportaudiocpp0/jammy 19.6.0-1.1 amd64
Portable audio I/O C++ bindings - shared library
mpg123/jammy 1.29.3-1build1 amd64
MPEG layer 1/2/3 audio player
portaudio19-dev/jammy 19.6.0-1.1 amd64
Portable audio I/O - development files
portaudio19-doc/jammy 19.6.0-1.1 all
Portable audio I/O - documentation
python-pyaudio-doc/jammy 0.2.11-1.3ubuntu1 all
Documentation for Python bindings for PortAudio v19
python3-pyaudio/jammy 0.2.11-1.3ubuntu1 amd64
Python3 bindings for PortAudio v19
squeezelite-pa/jammy 1.9.9-1395+git20220104.874e4f9-1 amd64
lightweight headless Squeezebox emulator - PortAudio version
先ほどと違い、かなりたくさん出てきたが39行目「portaudio19-dev」というパッケージが、説明文を読む限り「development files」となっており、開発に用いられる、あるいは、portaudioを用いているアプリケーションの実行に用いられるものだと予想がつくため、これが必要なファイルだということがなんとなく分かる。
これをインストールすることで、portaudioのライブラリが使えるようになる。
以上、いきなりライブラリが足りないと言われた場合の対処方法でした。ある程度名前からそれっぽいものを見つけることができる"慣れ"が必要になる気がします。
最近であれば、ChatGPTなどを用いることで対象ライブラリを含むパッケージを明示してくれたりもするので便利で併用することもあります。ただし、間違いも多かったり、その間違いを出力する脆弱性を利用したウイルスを含むパッケージをインストールさせるような攻撃方法があるなどとも聞くので、結局、自分で精査することは必要になりそうです。
以上、ありがとうございました。