C言語DB入門|開発環境と配布環境の違いを知ろう

C言語DB入門|開発環境と配布環境の違いを知ろう
第7章では、GTK 4とSQLiteを組み合わせ、登録・表示・変更・削除を行えるGUI版書籍管理アプリを完成させました。
次は、このアプリを開発環境が入っていないWindows PCでも使えるようにしていきましょう。
開発中は、MSYS2 UCRT64のターミナルから実行することで、GTK 4やSQLiteのライブラリを利用できていました。しかし、配布先のPCに同じ環境が用意されているとは限りません。
そのため、配布するときは、実行ファイルに加えて、実行に必要なDLLや関連ファイル、データの保存場所を整理する必要があります。
この記事では、次の内容を確認します。
- 開発環境と配布環境の違い
- 開発に必要なものと、実行に必要なものの違い
- 実行ファイルだけでは動かないことがある理由
- GTK 4とSQLiteの実行時ファイル
- プログラム本体とbooks.dbの役割の違い
- 第8章で進める配布作業の流れ
第8章の作業フォルダは、C:\c-db\chap08です。
開発環境と配布環境では目的が違う
開発環境は、プログラムを作成・修正・コンパイル・実行するための環境です。
一方、配布環境は、完成したアプリを利用するための環境です。
| 比較する項目 | 開発環境 | 配布環境 |
|---|---|---|
| 主な目的 | アプリを作る | アプリを使う |
| 主な利用者 | 開発者 | アプリの利用者 |
| ソースコードの編集 | 行う | 通常は行わない |
| コンパイル | 行う | 通常は行わない |
| 実行方法 | ターミナルや開発ツールから起動する | エクスプローラーやショートカットから起動する |
| 必要なもの | 開発ツールと実行時ファイル | アプリと実行時ファイル |
配布先の利用者は、ソースコードをコンパイルするのではなく、用意された実行ファイルを起動します。
そのため、開発PCにあるソフトウェアをすべて配布先へインストールする必要はありません。
GTKの公式サイトでも、Windows向けのGTKアプリは、通常、必要なGTKの実行時ファイルをアプリと一緒にまとめて配布する形が案内されています。gtk.org
図1:開発するPCとアプリを使うPCの違い
イラスト作成用プロンプト

この図から分かること
開発するPCには、ソースコードを実行ファイルへ変換するための道具が必要です。
アプリを使うPCには、完成した実行ファイルと、その実行に必要なファイルを用意します。
開発PCにあるものの役割を整理する
これまで準備してきたソフトウェアには、それぞれ異なる役割があります。
| ソフトウェアやファイル | 開発時の役割 | 配布先での扱い |
|---|---|---|
| MSYS2 | 開発ツールやライブラリを導入・管理する | 今回の配布ではインストールを前提にしない |
| GCC | C言語のソースコードをコンパイルする | コンパイラ本体は通常不要 |
| VS Code | ソースコードを編集する | アプリの実行には不要 |
| pkg-config | コンパイルに必要な設定を取得する | アプリの実行には不要 |
| GTK 4のヘッダーファイル | 型や関数の宣言をコンパイラへ伝える | アプリの実行には不要 |
| GTK 4の実行時DLL | ウィンドウやウィジェットなどの機能を提供する | 必要なものを配布する |
| SQLiteのヘッダーファイル | SQLite C APIの宣言を提供する | アプリの実行には不要 |
| SQLiteの実行時DLL | SQLの実行やデータベース操作を行う | 動的リンクしている場合に配布する |
| books.db | 書籍データを保存する | 利用者が読み書きするデータとして扱う |
ここで、「GCCは不要」と「GCCに関係するファイルはすべて不要」を混同しないようにしましょう。
GCCのコンパイラ本体は不要でも、ビルドしたプログラムや依存ライブラリが、GCCなどの実行時DLLを必要とする場合があります。
配布するファイルは、名前だけで判断せず、実際の依存関係を確認して決めます。
実行ファイルの中にすべてが入るわけではない
第7章では、次のようなコマンドで実行ファイルを作成しました。
gcc -std=c17 -Wall -Wextra book_manager.c -o book_manager.exe $(pkg-config --cflags --libs gtk4 sqlite3)このコマンドによって、book_manager.cからbook_manager.exeが作成されます。
ただし、通常の動的リンクでは、GTK 4やSQLiteの実装がすべて実行ファイルの中へ取り込まれるわけではありません。
アプリの実行時に、外部のDLLを読み込んで利用します。
DLLは実行時に利用する機能のまとまり
DLLは、Dynamic Link Libraryの略です。
Windowsのアプリが、実行時に読み込んで利用するライブラリです。
書籍管理アプリでは、たとえば次のような機能をライブラリに任せています。
- ウィンドウを表示する
- ボタンや入力欄を作る
- 文字を描画する
- SQLiteのSQLを実行する
- データベースファイルを読み書きする
MSYS2 UCRT64のパッケージに含まれるDLLの例として、GTK 4にはlibgtk-4-1.dll、SQLiteにはlibsqlite3-0.dllがあります。
ただし、この2つをコピーすれば配布が完成する、という意味ではありません。
GTK 4のDLLが、さらに別のDLLを利用しているためです。
DLLにも依存先がある
アプリが直接利用するDLLだけでなく、そのDLLが必要とするDLLも用意する必要があります。
| 依存関係 | 内容 |
|---|---|
| アプリからの直接の依存 | 実行ファイルがGTK 4やSQLiteなどを利用する |
| DLLからの間接的な依存 | GTK 4などが、さらに文字描画や画像処理などのライブラリを利用する |
| 実行中に読み込む機能 | 使用する機能に応じて、追加のモジュールなどを読み込む場合がある |
必要なDLLの構成は、使用しているパッケージのバージョンやビルド内容によって変わります。
第8章では、実際に作成した実行ファイルを基準に、必要な依存ファイルを調べていきます。
開発PCではDLLの場所が用意されている
開発中に、実行ファイルと同じフォルダへDLLをコピーしなくても動いていた理由を考えてみましょう。
MSYS2 UCRT64では、環境変数PATHの先頭側に、通常、次の場所が設定されています。
/ucrt64/bin
/usr/binこのうち/ucrt64/binには、UCRT64用のプログラムやDLLが置かれています。
MSYS2を標準的な場所へインストールした場合、/ucrt64/binはWindows側の次の場所に対応します。
C:\msys64\ucrt64\binUCRT64のターミナルからアプリを起動すると、その環境を引き継ぐため、必要なDLLを見つけられる場合があります。
PATHは場所を探すための情報
PATHは、実行するコマンドを探すときなどに使われる環境変数です。
Windowsの通常のデスクトップアプリでは、DLLを探す場所にもPATHが関係します。また、実行ファイルが置かれているフォルダも、通常のDLL検索先に含まれます。実際の検索順序には、Windowsの仕組みやアプリ側の設定も関係します。
配布先には、開発PCのC:\msys64\ucrt64\binがあるとは限りません。
そのため、開発PCのPATHに頼らず、配布したファイルから必要なDLLを読み込める状態にする必要があります。
図2:開発中に動く理由と配布時に必要な準備

この図から分かること
開発中は、MSYS2が用意した環境からDLLを見つけられるため、実行ファイルだけを操作しているように見えます。
配布時には、その環境に頼らず実行できるように、必要なファイルをまとめます。
DLLが足りないと自作のエラー画面も表示できないことがある
第7章では、SQLiteの処理に失敗したときに、GUIへエラーを表示しました。
しかし、起動に必要なDLLが見つからない場合は、プログラムのmainが実行される前に起動が止まることがあります。
この場合、アプリ自身のエラー表示処理は動きません。
| 問題が起きる段階 | 状況の例 | 表示されるものの例 |
|---|---|---|
| アプリの起動前 | 必要なDLLが見つからない | Windows側のエラーダイアログ |
| GUIの初期化や表示 | 関連ファイルが不足している | 警告、表示の不具合、機能の不足など |
| データベースを開くとき | 保存先へアクセスできない | アプリの起動エラー画面 |
| 登録・変更・削除のとき | 書き込み禁止や処理の競合 | アプリのメッセージ欄 |
配布作業では、アプリ内の処理だけでなく、アプリを起動できる環境そのものを整えることが必要になります。
GTK 4ではDLL以外のファイルも確認する
GUIアプリの配布では、DLLを集める作業だけで終わるとは限りません。
GTK 4と関連ライブラリが利用するデータファイルや、実行時に読み込むモジュールなども確認します。
| 確認するもの | 役割の例 |
|---|---|
| アイコン関連のファイル | ウィジェットなどで使用するアイコンを提供する |
| 設定スキーマ | GSettingsなどが利用する設定項目の定義を提供する |
| 翻訳データ | ライブラリ側の表示を各言語へ対応させる |
| 実行時モジュールやキャッシュ | 対応する画像形式など、追加機能の読み込みに使われる |
| アプリ独自の画像や設定 | アプリ自身が読み込む素材や設定を提供する |
これは、すべてのアプリに同じファイル一式が必須という意味ではありません。
必要なものは、使用するGTK 4の構成やアプリの機能によって異なります。DLL以外のファイルについては、8.4で配置場所も含めて確認します。
ファイルを集めるときは、開発に使ったUCRT64のパッケージを基準にします。別の環境や異なる構成のDLLを、その場で混ぜ合わせる方法は避けましょう。
SQLiteのプログラムと書籍データは別のもの
SQLiteについては、次の3つを区別すると分かりやすくなります。
| 名前 | 役割 |
|---|---|
| sqlite3.exe | ターミナルからSQLを実行するためのコマンドラインツール |
| libsqlite3-0.dll | C言語のアプリがSQLiteの機能を利用するためのライブラリ |
| books.db | 書籍のデータが保存されるファイル |
第7章のアプリは、SQLite C APIを呼び出してデータベースを操作しています。
そのため、書籍の登録や一覧表示を行うたびにsqlite3.exeを起動しているわけではありません。通常の利用だけなら、コマンドラインツールを配布先へ入れる必要はありません。
また、SQLiteはアプリに組み込んで利用する仕組みなので、今回の配布先でデータベースサーバーを起動する必要もありません。
books.dbには利用者のデータが入る
実行ファイルやDLLは、アプリを動かすためのものです。
一方、books.dbには、利用者が登録・変更・削除するデータが入ります。
| 分類 | 例 | 通常の利用中の扱い |
|---|---|---|
| プログラム本体 | book-manager.exe | 起動して実行する |
| 実行時ライブラリ | GTK 4やSQLiteのDLL | アプリが読み込む |
| 実行時データ | アイコンや設定スキーマなど | 主に読み込んで利用する |
| 利用者のデータ | books.db | 登録・変更・削除によって内容が変わる |
SQLiteのデータベース本体はファイルですが、更新中にはジャーナルなどの補助ファイルを使用することもあります。データベースのファイルだけでなく、その保存先フォルダで必要な読み書きができることも考えます。
プログラムを更新するときも、利用者が使っているbooks.dbを、配布用の初期データで上書きしないように扱いを分ける必要があります。
実行ファイルの場所とデータの保存場所を分けて考える
第7章のプログラムでは、books.dbを相対パスで指定していました。
実行時の作業フォルダにあるbooks.dbを開く構成です。
開発中は、ターミナルでC:\c-db\chap07へ移動してから実行していたため、どのデータベースを開くかが分かりやすい状態でした。
しかし、配布先では、次のように起動方法が変わることがあります。
- エクスプローラーからダブルクリックする
- デスクトップのショートカットから起動する
- 別のフォルダを作業場所にして起動する
ここで重要なのは、実行ファイルがあるフォルダと、実行時の作業フォルダは同じとは限らないという点です。
配布用には、どこにあるbooks.dbを開くのかを、プログラム側の処理とフォルダ構成の両方で決める必要があります。
dataフォルダを作るだけでは参照先は変わらない
第8章では、配布用フォルダ内のdataフォルダへbooks.dbを置く構成などを検討します。
ただし、books.dbをdataフォルダへ移すだけでは、第7章のプログラムが自動的にその場所を開くようにはなりません。
| 準備すること | 内容 |
|---|---|
| 保存場所を決める | 配布フォルダ内か、利用者ごとのデータ保存先かを決める |
| パスの求め方を決める | 起動方法が変わっても、意図したデータベースを開けるようにする |
| 書き込み可能か確認する | 保存先の権限を確認する |
| 初期データの扱いを決める | 空の状態で始めるか、サンプルデータを用意するかを決める |
この部分は、8.5でプログラムの変更とあわせて扱います。
アプリを管理者として起動することを前提にするのではなく、通常の利用者が読み書きできる保存先を選んでいきましょう。
第8章の作業フォルダを確認する
ここからは、第7章の完成版を出発点にして、配布用の準備を行います。
フォルダの役割を整理しておきましょう。
| フォルダ | 役割 |
|---|---|
| C:\c-db\chap07 | 第7章で完成させたGUI版CRUDアプリ |
| C:\c-db\chap08 | 配布に向けたソースコード、ビルド結果、配布ファイル |
| 配布先で展開するフォルダ | 利用者がアプリを起動するためのファイル一式 |
C:\c-db\chap08は開発者の作業場所です。
配布先にもC:\c-db\chap08という同じフォルダを作ってもらう、という意味ではありません。
UCRT64を使用していることを確認する
MSYS2 UCRT64のターミナルで、次のコマンドを実行します。
echo "$MSYSTEM"
command -v gcc実行結果の例
UCRT64
/ucrt64/bin/gccechoは、MSYSTEMの値を表示しています。
command -vは、実行するgccがどこにあるかを確認するコマンドです。
今回の教材では、これまでと同じUCRT64のGCCを使用します。
UCRT64はx86_64向けの環境です。配布する実行ファイルとDLLも同じ構成でそろえ、対象となるWindows環境で動作確認します。
第8章へ完成版のソースコードをコピーする
第2章で準備した作業フォルダへ移動します。
cd /c/c-db/chap08
pwd実行結果の例
/c/c-db/chap08第7章の完成版ソースコードをコピーします。
cp -i /c/c-db/chap07/book_manager.c /c/c-db/chap08/book_manager.c-iを指定しているため、コピー先に同名のファイルがある場合は、上書きするか確認されます。
第8章で編集済みのファイルを残したい場合は、nを入力します。
コピーしたファイルを確認します。
ls book_manager.c実行結果の例
book_manager.cbooks.dbの準備と配置は、保存場所を決める段階で行います。
この段階では、配布に向けて編集するソースコードを第8章へ用意できれば十分です。
#include <gtk/gtk.h>のincludePathエラーが出る場合
以下の記事を参考にしてください。
第8章の実行ファイル名を確認する
第7章では、実行ファイル名をbook_manager.exeとしていました。
第8章では、提示した配布構成に合わせ、配布用の実行ファイル名をbook-manager.exeとします。
| 用途 | ファイル名 |
|---|---|
| ソースコード | book_manager.c |
| 第7章の実行ファイル | book_manager.exe |
| 第8章の配布用実行ファイル | book-manager.exe |
ソースコードと実行ファイルは、同じ名前である必要はありません。
次の記事で、GCCの-oに配布用の名前を指定してビルドします。
配布用フォルダに何を入れるか考える
配布用フォルダには、アプリを使うためのファイルをまとめます。
現時点での構成案を、役割ごとに整理すると次のようになります。
| 配布用フォルダ内のもの | 内容 |
|---|---|
| book-manager.exe | 書籍管理アプリ本体 |
| 必要なDLL | GTK 4、SQLite、その依存ライブラリ |
| GTK関連のフォルダ | 必要なアイコン、設定スキーマ、モジュールなど |
| dataフォルダ | この配置方式を採用する場合のbooks.db |
| 利用方法の説明 | 起動方法やデータの保存場所など |
| ライセンス関連の文書 | 同梱するライブラリなどに必要な文書 |
これは構成を考えるための表です。実際のファイル名と配置は、依存関係やデータの保存方針を確認しながら決めます。
特に、DLLの検索場所、GTK関連ファイルの検索場所、books.dbの参照先は、別々に確認する必要があります。
図3:配布用フォルダにまとめるものと利用者のデータ

この図から分かること
配布するものには、アプリを動かすためのファイルと、利用者が変更するデータがあります。
それぞれの役割を分けて考えることで、保存場所やアプリ更新時の扱いを決めやすくなります。
開発PCで起動できても配布確認は終わらない
配布用フォルダを作成した後、開発PCで起動できたとしても、それだけでは必要なファイルがそろったとは判断できません。
開発PCに残っているDLLや環境設定を、意図せず利用している可能性があるためです。
また、エクスプローラーから起動できた場合でも、Windows側のPATHなどに開発用の場所が設定されていれば、そこからDLLを読み込むことがあります。
そこで、8.7では、MSYS2や開発用ライブラリを用意していない別のWindows環境で確認します。
| 確認する項目 | 確認する理由 |
|---|---|
| 実行ファイルを起動できる | 必要なDLLがそろっているか確認する |
| ウィンドウや文字が表示される | GTK 4と関連ファイルが利用できるか確認する |
| 書籍一覧が表示される | 意図したbooks.dbを開いているか確認する |
| 登録・変更・削除ができる | データの保存先へ書き込めるか確認する |
| 再起動後もデータが残る | 保存と読み込みが同じデータベースに対して行われるか確認する |
| 配布フォルダを移動しても起動できる | 開発PC固有の場所に依存していないか確認する |
「画面が表示された」だけでなく、データベースアプリとして最後まで操作できることを確認しましょう。
第8章で配布まで進める流れ
ここからの作業を、記事ごとに整理します。
| 記事 | 主な作業 | 確認すること |
|---|---|---|
| 8.2 配布用にプログラムをビルドする | 配布用の設定で実行ファイルを作る | 最適化やGUIアプリとしてのビルド |
| 8.3 必要なDLLを確認する | 実行ファイルとDLLの依存関係を調べる | 直接・間接の依存 |
| 8.4 GTK 4の実行に必要なファイルをまとめる | DLL以外の関連ファイルを準備する | ファイルの種類と配置 |
| 8.5 SQLiteデータベースファイルの保存場所を考える | データの保存先とパスの求め方を決める | 起動場所と書き込み権限 |
| 8.6 配布用フォルダを作成する | 必要なファイルを所定の場所へまとめる | 配布するフォルダ全体の構成 |
| 8.7 別のWindows環境で動作を確認する | 開発環境に依存しないことを確かめる | 起動、CRUD、再起動後の保存内容 |
| 8.8 ZIP形式の配布ファイルを作成する | 確認済みのフォルダをZIPにする | 展開後に利用できること |
| 8.9 C言語DB入門の総まとめ | 学んだ技術とアプリの発展を振り返る | C言語からWindows GUIアプリの配布まで |
第7章では、アプリの機能を完成させました。
第8章では、そのアプリを利用者のPCへ届けるために、実行時の依存ファイルとデータの扱いを整えていきます。
次の記事「配布用にプログラムをビルドする」では、C:\c-db\chap08に用意したbook_manager.cから、配布用のbook-manager.exeを作成します。










