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開発ツールやライブラリを導入・管理する今回の配布ではインストールを前提にしない
GCCC言語のソースコードをコンパイルするコンパイラ本体は通常不要
VS Codeソースコードを編集するアプリの実行には不要
pkg-configコンパイルに必要な設定を取得するアプリの実行には不要
GTK 4のヘッダーファイル型や関数の宣言をコンパイラへ伝えるアプリの実行には不要
GTK 4の実行時DLLウィンドウやウィジェットなどの機能を提供する必要なものを配布する
SQLiteのヘッダーファイルSQLite C APIの宣言を提供するアプリの実行には不要
SQLiteの実行時DLLSQLの実行やデータベース操作を行う動的リンクしている場合に配布する
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\bin

UCRT64のターミナルからアプリを起動すると、その環境を引き継ぐため、必要な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.dllC言語のアプリが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/gcc

echoは、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.c

books.dbの準備と配置は、保存場所を決める段階で行います。

この段階では、配布に向けて編集するソースコードを第8章へ用意できれば十分です。

#include <gtk/gtk.h>のincludePathエラーが出る場合

以下の記事を参考にしてください。

C言語GUI入門|#include <gtk gtk.h="">のincludePathエラー</gtk>

C言語GUI入門|#include <gtk/gtk.h>のincludePathエラー このエラーは、VS Code の C/C++拡張機能(IntelliSense)が gtk/gtk.h の場所を見つけられていないときに…

第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書籍管理アプリ本体
必要なDLLGTK 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を作成します。

Follow me!