オプション沼(3) 何は無くても pkg-config がなんとかしてくれる?かも?

Joseph Halfmoon

今回はオプション界?の黒幕、pkg-configについてチョイと調べてみました。pkg-configが参照するpcファイルの在処が知りたかったです。ライブラリを使ってビルドするときにpkg-configにお世話になることが多いですが、よろしくという感じでお願いする一方。pkg-configの暗躍はよく分かってないっと。

※動作確認に Windows11 WSL2上のUbuntu 20.04 LTS を使用しています。

pkg-config

Linux上にインストール済のライブラリを参照しながら、コンパイル、リンクする場合によく使うコマンドです。例えば、『ソフトな忘却力第27回』で使わせていただいた mpfr ライブラリを参照するC言語ソース root2.c をコンパイルするときはこんな感じです。

$ gcc root2.c $(pkg-config --cflags --libs mpfr)

馬鹿の一つ覚えの以下の3点セットを pkg-configに渡してお願いすれば

    • –cflags
    • –libs
    • ライブラリ名

コンパイル用のコマンドライン引数が出来上がるっと。ただ pkg-config自体は

$( ) のサブシェルの中に押し込められている

ということで表に出てくることはまずありませぬ。裏方、下請け。。。折角なのでコマンドラインから上記の mpfr ライブラリ用の pkg-configの挙動を探ったものが以下に。

pcMPFR

なんだ、たったこれだけかい。でもま、mpfrライブラリを使うときに、-lmpfrだけでなく -lgmp も必要、ということを処理してくれる(忘れていても良い)というのは忘却力の年寄の友。

pkg-configのPATH

pkg-configの使い方は、手元のUbuntu 20.04LTSの場合、infoコマンドでもmanコマンドでも読むことができました。

info pkg-config

もしくは

man pkg-config

どちら見ても内容的には同じもんじゃないかと思いますが。

info読めば、pkg-configの説明として、

Return metainformation about installed libraries

と書かれております。その metainfomation なるものが記されているのが .pc という拡張子のテキストファイルです。明示的に自分で環境変数

PKG_CONFIG_PATH

を制御すれば所望のパスのどこにでもおけるみたいです。でも私のように apt コマンドでインストールしたライブラリを参照する程度なら、pkg-configのデフォルトのパス配置で十分だあ。

デフォルトのパスがどこへ向いているのかは、pkg-config内部の変数 pc_path を見てやれば分かるみたいデス。こんな感じ。

$ pkg-config --variable pc_path pkg-config

実行した結果が以下に。

pcconfVAR

 

上記はちょっと見ずらいのでテキストで列挙すると以下のようでした。ディレクトリそのものが無い参照先もありますが、ディレクトリによっては数十個のpcファイルが格納されとります。以下のパスの後の数字は手元のシステムでのpcファイル数です。当然、インストールしたライブラリが増えればpcファイルも増えていくのだと思います。

    • /usr/local/lib/x86_64-linux-gnu/pkgconfig … ディレクトリが存在しない
    • /usr/local/lib/pkgconfig … 1
    • /usr/local/share/pkgconfig … ディレクトリが存在しない
    • /usr/lib/x86_64-linux-gnu/pkgconfig … 74
    • /usr/lib/pkgconfig … 1
    • /usr/share/pkgconfig … 35

なお、先ほどコンパイルするのに使った mpfr.pc というファイルは、

/usr/lib/x86_64-linux-gnu/pkgconfig

の中に格納されてました。一番多くのpcファイルがあるところ。mpfr.pc の中身を愛用のmidnight commanderで眺めているところが冒頭のアイキャッチ画像に。

オプション沼(2) gcc、いつもの-gオプション。objdumpにも-gあったのね へ戻る

オプション沼(4) gccに-pgオプションつけて、アッカーマン関数の再帰の回数を数えてみる へ進む