C言語+MySQL入門|pkg-configを確認する

C言語+MySQL入門|pkg-configを確認する

ここまでに、C言語からMySQL Serverを利用するためのConnector/Cと、GUIの画面づくりに使うGTK 4をインストールしました。

これらのライブラリをCプログラムから利用するには、コンパイルするときに、ヘッダーファイルの場所やリンクするライブラリを指定する必要があります。

その設定を取得するためのツールが pkg-config です。

この記事では、UCRT64環境でpkg-configが使えることを確認し、Connector/CとGTK 4のビルド設定を取得します。

  • pkg-configの役割を知る。
  • UCRT64用のpkg-configを準備する。
  • Connector/CとGTK 4の情報を取得する。
  • 表示されたオプションの意味を理解する。
  • 設定が見つからないときの確認方法を知る。

今回は、設定を取得できるところまでを確認します。取得した設定を使ったCプログラムのビルドは、後の章で行います。

pkg-configはビルドに必要な設定を教えてくれる

Cプログラムから外部ライブラリを利用するときには、主に次の情報が必要になります。

必要な情報何のために使うか
ヘッダーファイルを探す場所関数や型の宣言を読み込むため
ライブラリを探す場所リンクに必要なファイルを見つけるため
リンクするライブラリプログラムが利用する関数の参照を解決するため
その他のコンパイル設定ライブラリが必要とするマクロなどを指定するため

これらを毎回手作業で調べるのは大変です。GTK 4のように、複数の関連ライブラリを使う場合は、指定する項目も増えます。

pkg-configは、ライブラリに付属する設定情報を読み取り、コンパイラーやリンカーへ渡すオプションを出力します。GTKの公式ドキュメントでも、ビルド設定の取得にpkg-configを使う方法が案内されています。

pacman、pkg-config、GCCの役割を整理する

名前の似たツールや、ビルドに関わるツールが増えてきたので、役割を整理しておきましょう。

ツール主な役割
pacmanパッケージをインストール・更新する
pkg-configライブラリを利用するためのビルド設定を出力する
GCCCプログラムのコンパイルやリンクを行う

pkg-config自体は、ライブラリをインストールしたり、Cプログラムをコンパイルしたりするツールではありません。

インストールはpacman、設定の取得はpkg-config、ビルドはGCC と覚えると整理しやすくなります。

図1:pkg-configがビルド設定を取り出す仕組み

この図から分かること

pkg-configは、ライブラリに付属する設定情報を読み取ります。

取得した設定をGCCに渡すことで、ヘッダーファイルの場所や、必要なライブラリを指定できます。ライブラリごとの細かな設定を、すべて手作業で入力する負担を減らせます。

設定情報は.pcファイルに入っている

前回までの記事で、次のファイルを紹介しました。

利用するライブラリ設定情報のファイルpkg-configで指定する名前
MariaDB Connector/Cmysqlclient.pcmysqlclient
GTK 4gtk4.pcgtk4

pkg-configには、通常、.pcを取り除いた名前を指定します。この名前を、この記事では モジュール名 と呼びます。

たとえば、GTK 4の情報を取得するときに指定するのはgtk4です。インストール時に使った長いパッケージ名ではありません。

用途Connector/Cの場合
pacmanでインストールするパッケージ名mingw-w64-ucrt-x86_64-libmariadbclient
pkg-configで情報を取得するモジュール名mysqlclient

今回のConnector/Cパッケージには、mysqlclient.pcとlibmariadb.pcが含まれています。この連載では、MySQL用のビルド設定を取得する名前としてmysqlclientを使用します。

名前にmysqlが入っていますが、ここで取得するのは、導入したMariaDB Connector/Cの情報です。

UCRT64環境を確認する

スタートメニューから、MSYS2 UCRT64を起動してください。

この記事のコマンドは、すべてUCRT64のターミナルで実行します。

echo $MSYSTEM

実行結果の例

UCRT64

続けて、GCCの場所も確認します。

command -v gcc

実行結果の例

/ucrt64/bin/gcc

GCC、Connector/C、GTK 4に加えて、今回使うpkg-configもUCRT64用でそろえます。

pkg-configを準備する

まず、pkg-configが見つかるか確認します。

command -v pkg-config

実行結果の例

/ucrt64/bin/pkg-config

このパスが表示されれば、UCRT64用のpkg-configが選ばれています。

何も表示されない場合や、/usr/binなど別の場所が表示される場合は、UCRT64用のパッケージが導入されているか確認しましょう。

インストールするパッケージはpkgconf

MSYS2では、pkg-configの機能を提供する実装として pkgconf が使われています。

そのため、インストールするパッケージ名と、実行するコマンド名が少し異なります。

項目名前
インストールするパッケージmingw-w64-ucrt-x86_64-pkgconf
この連載で実行するコマンドpkg-config

まだ導入されていない場合は、MSYS2全体を更新してからインストールします。

pacman -Syu

途中でMSYS2の終了を求められた場合は、案内に従って終了し、UCRT64を開き直して同じ更新コマンドを再実行してください。

更新が完了したら、次のコマンドを実行します。

pacman -S mingw-w64-ucrt-x86_64-pkgconf

インストールの確認が表示されたら、内容を確認して進めます。このパッケージが、UCRT64用のpkg-configコマンドを提供します。

導入後は、もう一度command -v pkg-configを実行し、/ucrt64/binのコマンドが選ばれることを確認しましょう。

pkg-config自身のバージョンを確認する

次のコマンドを実行します。

pkg-config --version

実行結果の例

3.0.7

バージョン番号は導入した時期によって変わります。

ここで表示されるのは、pkg-configとして動作しているツール自身のバージョンです。Connector/CやGTK 4のバージョンではありません。

最初に覚えたいオプション

この記事では、次のオプションを使います。

オプション取得する情報
--versionpkg-config自身のバージョン
--modversion指定したモジュールのバージョン
--cflagsコンパイル時に必要なオプション
--libsリンク時に必要なオプション

ライブラリのバージョンには--modversionを使います。--versionとの違いに注意しましょう。

図2:コンパイル用とリンク用の設定

この図から分かること

--cflagsは、ヘッダーファイルの検索場所など、コンパイル時の設定を取得します。

--libsは、ライブラリの検索場所や名前など、リンク時の設定を取得します。どちらも、ライブラリを利用した実行ファイルを作るために使います。

Connector/Cの情報を取得する

まずは、MySQLへの接続に使うConnector/Cの情報を確認しましょう。

バージョンを確認する

pkg-config --modversion mysqlclient

実行結果の例

3.4.9

表示される番号は、インストールされているConnector/Cのバージョンによって変わります。

MySQL Serverを8.4系にしていても、ここで8.4と表示されるわけではありません。取得しているのは、クライアントライブラリ側の情報です。

コンパイル用の設定を取得する

pkg-config --cflags mysqlclient

実行すると、ヘッダーファイルの検索場所などが、コンパイル用のオプションとして表示されます。

表示されるパスやオプションは、パッケージのバージョンや設定によって異なります。Connector/Cのヘッダーファイルを探すための指定が出力されているか確認しましょう。

リンク用の設定を取得する

pkg-config --libs mysqlclient

実行すると、Connector/Cをリンクするためのオプションが表示されます。

モジュール名がmysqlclientでも、利用するライブラリがMariaDB Connector/Cなので、出力にmariadbという名前が含まれることがあります。

両方をまとめて取得する

コンパイル用とリンク用の設定は、まとめて取得することもできます。

pkg-config --cflags --libs mysqlclient

エラーなく設定が表示されれば、pkg-configからConnector/Cのビルド情報を取得できています。

GTK 4の情報を取得する

次はGTK 4です。モジュール名をgtk4に変えて確認します。

バージョンを確認する

pkg-config --modversion gtk4

実行結果の例

4.24.0

こちらも、表示されるバージョン番号はインストールした時期によって変わります。

コンパイル用の設定を取得する

pkg-config --cflags gtk4

GTK 4本体に加えて、関連するライブラリのヘッダーファイルを探すための設定などが表示されます。

出力が長くなることがありますが、異常ではありません。画面上で何行にも折り返されても、複数のオプションが続けて表示されているだけです。

リンク用の設定を取得する

pkg-config --libs gtk4

GTK 4や、必要な関連ライブラリをリンクするための設定が表示されます。

両方をまとめて取得する

pkg-config --cflags --libs gtk4

GTK 4では関連ライブラリも多いため、手作業でオプションを書き写すより、pkg-configの出力をそのままビルドに渡す方法が便利です。

今は、すべてのライブラリ名を覚えなくても大丈夫です。

表示されたオプションを読んでみよう

出力されるオプションのうち、代表的なものを整理します。

次の表は、出力全体を再現したものではなく、個々のオプションの読み方を示しています。

オプションの例意味
-IC:/msys64/ucrt64/include/gtk-4.0ヘッダーファイルを探す場所を追加する
-LC:/msys64/ucrt64/libリンク用ライブラリを探す場所を追加する
-lgtk-4GTK 4のライブラリをリンク対象にする
-lmariadbMariaDB Connector/Cのライブラリをリンク対象にする
-Dで始まる指定コンパイル時に使用するマクロを定義する

特に、次の三つを見分けられるようにしておきましょう。

  • -Iは、大文字のアイ。ヘッダーファイルの検索場所です。
  • -Lは、大文字のエル。ライブラリの検索場所です。
  • -lは、小文字のエル。リンクするライブラリの指定です。

出力のパスがWindows形式でも大丈夫

MSYS2をC:\msys64にインストールした場合、pkg-configの出力にC:/msys64/ucrt64のようなパスが含まれることがあります。

MSYS2のpkg-configは、.pcファイルの配置場所に応じてパスを調整します。そのため、ターミナルで使っている/ucrt64と表記が異なっていても、それだけで異常とは判断しません。

また、標準の検索場所として扱われるパスは、出力から省かれる場合があります。表の例と文字列が完全に一致することよりも、正しいUCRT64環境でエラーなく取得できることを確認しましょう。

取得した設定をGCCへ渡す考え方

後の章では、pkg-configの出力をGCCのコマンドに組み込みます。

UCRT64のBashでは、コマンドを$()で囲むと、そのコマンドの出力を別のコマンドへ埋め込めます。この仕組みを コマンド置換 と呼びます。

たとえば、$(pkg-config --cflags mysqlclient)という部分は、実行時にConnector/Cのコンパイル用オプションへ置き換えられます。

ビルド時の流れは、次のようになります。

  1. Bashがpkg-configを実行する。
  2. pkg-configが必要なオプションを出力する。
  3. Bashが、その出力をGCCの引数に組み込む。
  4. GCCが受け取った設定でコンパイルやリンクを行う。

この仕組みを使えば、長いパスや多数のライブラリ名を、毎回手作業で書き写す必要がありません。GTKの公式入門でも、この形でビルド設定を渡しています。

具体的なGCCコマンドは、それぞれのライブラリを使うプログラムを作成するときに紹介します。

図3:設定の取得と実際の動作確認は別の段階

この図から分かること

pkg-configで情報を取得できることは、ライブラリのビルド設定を読み取れたという意味です。

自作プログラムをビルドできるか、実行時にDLLを読み込めるか、MySQL Serverに接続できるかは、それぞれ別の段階で確認します。

設定が見つからないときは

pkg-config自体が見つからない

まず、次の二点を確認してください。

  • MSYS2 UCRT64を起動しているか。
  • mingw-w64-ucrt-x86_64-pkgconfをインストールしたか。

command -v pkg-configの結果が/ucrt64/bin/pkg-configになることを確認しましょう。

mysqlclientやgtk4が見つからない

pkg-configは起動していても、対象の.pcファイルが見つからない場合があります。

まずは、指定したモジュール名を確認します。

調べる対象指定するモジュール名
Connector/Cmysqlclient
GTK 4gtk4

次に、ライブラリのパッケージが導入されているか確認します。

pacman -Q mingw-w64-ucrt-x86_64-libmariadbclient
pacman -Q mingw-w64-ucrt-x86_64-gtk4

両方とも、パッケージ名とバージョンが表示されることを確認してください。

続けて、設定ファイルの存在を調べます。

ls -1 /ucrt64/lib/pkgconfig/mysqlclient.pc /ucrt64/lib/pkgconfig/gtk4.pc

実行結果の例

/ucrt64/lib/pkgconfig/gtk4.pc
/ucrt64/lib/pkgconfig/mysqlclient.pc

ファイルが存在するのに見つからない場合は、使用しているpkg-configや検索先の設定を確認します。

検索先の設定を確認する

.pcファイルの検索に関係する環境変数には、PKG_CONFIG_PATHがあります。

echo $PKG_CONFIG_PATH

実行結果の例

/ucrt64/lib/pkgconfig:/ucrt64/share/pkgconfig

MSYS2では、通常、起動した環境に合わせて検索先が設定されます。

この環境変数以外にも既定の検索先があるため、表示内容だけで成功・失敗を判断することはできません。ただし、過去に別の環境用のパスを設定している場合は、意図しない.pcファイルを参照する原因になります。

まずはUCRT64を開き直し、環境とコマンドの場所を確認しましょう。エラーに依存ライブラリの名前が表示されている場合は、そのライブラリの設定情報も取得できていない可能性があります。

バージョンは表示されるが、実行時にDLLが見つからない

pkg-configが扱うのは、主にビルド時の設定です。

実行時のDLL検索とは役割が異なるため、pkg-configでバージョンが表示されても、DLLの不足まで確認できたことにはなりません。

後の章でアプリを実行するときは、UCRT64ターミナルから起動することや、必要なDLLがそろっていることも確認していきます。

次はコードを書く作業環境を整える

Connector/CとGTK 4の両方について、--modversionでバージョンが表示され、--cflagsと--libsで設定を取得できれば、今回の確認は完了です。

ここまでで、コンパイラーとライブラリに加えて、それらを結び付けるビルド設定を取得する方法もそろいました。

次の記事ではVS Codeを準備し、Cファイルを編集・保存して、UCRT64ターミナルからビルドするための作業環境を整えます。

Follow me!