トホホな疑問(52) WSL2、Ubuntu、学ばないな、pkg-configでコケる

Joseph Halfmoon

ようやくWindows11機を入手、Windows10機から「引っ越し」中です。昔の環境をそのままコピーすると無駄なものも大量に取り込んでしまうので必要最小限、手作業で「厳選」。WSLもUbuntu20.04は変わらないのですが、1から2へアップグレード。Cのビルド環境ができたことを確認しようとしてコケました。トホホ。

WSL2にインストールした直後のUbuntu20.04には、gccなど必要なツールチェーンもライブラリも入っていないので、例によって sudo apt update, sudo apt upgradeのあと、いそいそとパッケージを導入いたしました。

    1. build-essential、これでgcc/g++などのツールチェーン、binutil、標準ライブラリなどOK
    2. でも上記にはデバッガは含まれてないです。gdb を導入。
    3. また、make は入ってますが、cmakeやninjaは入ってないです。cmakeとninja-buildを導入。

まあ、これで普通にCのソース書いてビルドできるはず。でも折角なので、何かライブラリを拾ってきて、そのサンプルプログラムを動かしてみようと考えてツボにはまりました。

cairoグラフィクス・ライブラリ

cairoは、結構いろいろなソフトの裏側で画像生成に使われているライブラリです。プログラムから呼び出せる paint プログラムみたいなもの。線引いて、フィルして、みたいな操作ができる関数が多数あります。画面上で表示できるだけでなく、ファイル入出力もサポートしております。CだけでなくC++にも対応しており、C++用には cairomm というお名前のライブラリになってるみたいです。今回はC用のcairoを使わせていただいております。ホームページが以下に。

cairo

上記の開発用のヘッダファイル、ライブラリ等をUbuntu20.04にインストールするのは簡単。以下で済みます。

sudo apt-get install libcairo2-dev

そして以下のページの下にGetting Startedの項があり、そこにまさにcairo版のHello, Worldプログラムが記載されております。これをコピペしてビルドして画像が生成できればOKじゃね。

Frequently Asked Questions

上記のGetting Startedにはビルドのコマンドラインとして以下のような記述があります(bashの場合)

cc -o hello $(pkg-config --cflags --libs cairo) hello.c

pkg-config使うのね、インクルードパスとかライブラリとかいろいろ設定しないといけないから手動で設定するのは辛いしね。でも何か嫌な予感が。。。第48回で似たようなライブラリ相手に似たようなところでハマっていたのです。

PKG_CONFIG_PATHを設定すればpkg-configは動くけれども

何もせずにpkg-configをしかけてもダメです。ありがちな状況ですが、pkg-configコマンドが参照する cairo.pc ファイルは、標準のPATHとは違う場所にインストールされてました。まずはその場所を探し出すところから。手元の環境では以下にありました。

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

ここを参照してくれるように、環境変数 PKG_CONFIG_PATHに上記を設定しました。また、ライブラリ本体は以下にありました。

/usr/lib/x86_64-linux-gnu

念のため、環境変数 LD_LIBRARY_PATH に上記も設定します。

コマンドラインの順番でOKとNGが分かれる

Getting Startedのサンプルコマンドラインが頭にあり、それをほぼそのままコピペしてビルドしてみました。ccをgccにして、ソースファイル名を変更したのでそれを変えただけです。

gcc -o helloCairo $(pkg-config --cflags --libs cairo) helloCairo.c

ダメでした。コンパイルはできるのですが、リンカが文句を垂れます。おかしいなあ、ちゃんとライブラリのパスは見えているはずなんだけれども。。。

結論を言えば、以下のようにコマンドラインの引数の順番を変えれば一瞬でビルドは成功します。

gcc helloCairo.c -o helloCairo $(pkg-config --cflags --libs cairo)

結局のところ、ライブラリを走査する順番とmain()関数を走査する順番の問題だけのようです。pkg-config を先にしてしまうと、main()関数を走査して呼び出し先の関数名を見つけたときに参照を解決できんと。

わかってしまえばしょうもない。なんだかな~トホホ。

生成した画像

WSL2上でビルド後、実行して出来た hello.png ファイルをWindows側のプログラムにお願いして表示した様子がアイキャッチ画像に。

nkv.exe hello.png

勿論 mspaint.exe でもよい(「フォト」は実行ファイル名を知らんし)のですが、ストアアプリでなく、以下のソフトウエアを使わせていただいております。ありがとうございます。

NkV – Image viewer for Windows

見た目は極端にシンプルですが、キーボードで各種操作ができる優れものです。linux側から起動するときにはファイル名も短くてお楽。

まあ、WSL2上でもXアプリを走らせてLinuxのGUIも使えるみたいですけど、インストールせずに済むならそれに越したことはないと。シンプル・イズ・ベスト、古い古いキャッチコピーですな。

トホホな疑問(51) 定番2SC1815のIc-Vbe特性、意外とバラつかないのね? へ戻る

トホホな疑問(53) VScodeからESP-IDFインストール、ターゲットによる? へ進む