ソースをダウンロードしてコンパイル&リンクしたときに依存関係エラーで必要なファイルやライブラリが表示されたり
他のマシンでコンパイル済やバイナリーを持ってきたときに実行するとxxxx.soがありません。
などと表示されたときにapt-fileコマンドを使えば、そのファイルが格納されているパッケージを探し出すことができます。
尚、apt系のコマンドなので、Debian系(Ubuntu, LinuxMint, など)が対象となります。
$ lsb_release -cd Description: Ubuntu 18.04.2 LTS Codename: bionic
dpkg -S ファイル名により同様に指定したファイルがどのパッケージに存在するかを確認することができますが、
インストール済パッケージのみが対象となります。
今回は未インストールでも対象のファイルを探すためapt-fileコマンドを使います。
apt-fileコマンドはデフォルトではインストールされていないはずなので、端末(ターミナル)を起動して、
以下のコマンドを実行し、apt-fileコマンドをインストールします。
sudo apt install apt-file
インストール後、以下のコマンドでパッケージ情報をアップデートしてください。
sudo apt update
尚、今回紹介したapt-fileでも同様のことができますが、廃止予定らしいです。
以下の記述通り、apt updateを使えば良いでしょう。
$ man apt-file <省略> update Deprecated action that just calls "apt update". <省略>
実際にapt-fileコマンドを使ってファイルを探してみます。
使用例として、2つ以下に記します。
一番簡単なのは以下の構文になります。
apt-file search ファイル名
例として、他のマシンに存在するバイナリをコピーして持ってきたら、libcurl-nss.so.3が無いと言われました。
libcurl-nss.so.3が存在するパッケージを探してみます。
検索中は少々時間がかかります。
$ apt-file search libcurl-nss.so.3 libcurl3-nss: /usr/lib/x86_64-linux-gnu/libcurl-nss.so.3
上記にお通り、libcurl3-nssというパッケージ(左側)に存在することが表示されます。
あとは、apt install パッケージ名でインストールすれば解決です。
また、すべてのファイル名を入力しなくても検索が可能です。
$ apt-file search libcurl-nss libcurl3-nss: /usr/lib/x86_64-linux-gnu/libcurl-nss.so.3 libcurl3-nss: /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4 libcurl3-nss: /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.5.0 libcurl4-nss-dev: /usr/lib/x86_64-linux-gnu/libcurl-nss.a libcurl4-nss-dev: /usr/lib/x86_64-linux-gnu/libcurl-nss.la libcurl4-nss-dev: /usr/lib/x86_64-linux-gnu/libcurl-nss.so
パッケージ名のみ表示したい場合は、-lオプションを追加します。
$ apt-file -l search libcurl-nss libcurl3-nss libcurl4-nss-dev
オプションに-xをつけると正規表現で検索できます。
以下に実行例を記します。
$ apt-file -x search 'libcurl-nss.so.[0-9]'
libcurl3-nss: /usr/lib/x86_64-linux-gnu/libcurl-nss.so.3 libcurl3-nss: /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4 libcurl3-nss: /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.5.0
パッケージ名のみ表示したい場合は、-lオプションを追加します。
$ apt-file -xl search 'libcurl-nss.so.[0-9]' libcurl3-nss
以上、apt-fileコマンドを使ってインストール済み、未インストール済みを問わず
該当するパッケージを検索する方法でした。