C言語GUI入門|開発環境の全体構成

この記事の概要

C言語でGUIアプリケーションを開発するときは、ひとつのソフトウェアだけですべての作業を行うわけではありません。

本コンテンツでは、Windows上に次の開発環境を用意します。

  • MSYS2
  • GCC
  • GTK 4
  • Visual Studio Code
  • MSYS2 UCRT64環境

Visual Studio Codeでソースファイルを作成し、MSYS2 UCRT64環境でGCCを動かします。GCCは、GTK 4の機能を利用しながらソースファイルを実行ファイルへ変換します。

それぞれのツールには、はっきりとした役割があります。

ツール主な役割
WindowsGUIアプリケーションを開発、実行するOS
MSYS2開発ツールやライブラリを導入し、利用できる環境を整える
GCCC言語のソースファイルをコンパイル、リンクする
GTK 4ウィンドウやボタンなどのGUI機能を提供する
Visual Studio Codeソースファイルの作成や編集を行う
UCRT64環境Windows向けのGCCやGTK 4を正しく組み合わせて使う

この節では、各ツールを個別に見るだけでなく、ソースファイルからWindows向けの実行ファイルが作られるまでのつながりを詳しく見ていきます。

第2章では、まだ具体的なプログラムは作成しません。ここでは、これから構築する開発環境の全体像をつかんでいきましょう。

開発環境は複数の道具で構成される

C言語でGUIアプリケーションを作るには、少なくとも次の作業が必要です。

  • C言語のソースファイルを書く
  • ソースファイルの文法を確認する
  • コンピューターが実行できる形式へ変換する
  • GTK 4の機能を実行ファイルと結び付ける
  • 完成したアプリケーションをWindows上で実行する

これらの作業を、Visual Studio Code、GCC、GTK 4、MSYS2が分担します。

料理にたとえると、Visual Studio Codeは作業台、ソースファイルはレシピ、GCCは調理を担当する人、GTK 4はGUIを作るための材料、MSYS2は道具や材料をまとめて管理する場所のようなものです。

どれかひとつだけをインストールしても、目的のGUIアプリケーションは完成しません。それぞれが連携することで、Windows上で動くGUIアプリケーションを作れるようになります。

図1:GUI開発環境を構成する道具

この図から分かること

Windows向けのGUIアプリケーションは、Visual Studio Code、MSYS2 UCRT64、GCC、GTK 4が連携して作られます。

Visual Studio Codeだけで実行ファイルを作るわけではありません。Visual Studio Codeで作ったソースファイルをGCCが処理し、そのときにGTK 4の機能を組み込みます。MSYS2 UCRT64は、GCCとGTK 4を利用できる環境を整えます。

MSYS2の役割

MSYS2は、Windows上でC言語の開発ツールやライブラリを扱いやすくするための環境です。

本コンテンツでは、主に次の目的で使用します。

  • GCCをインストールする
  • GTK 4をインストールする
  • インストールしたパッケージを更新する
  • Bash形式のターミナルを使用する
  • コンパイルに必要なツールをまとめて管理する

MSYS2には、pacmanというパッケージ管理ツールが用意されています。pacmanを利用すると、GCCやGTK 4などのソフトウェアを、依存関係も含めて導入、更新、削除できます。

MSYS2はコンパイラーではない

MSYS2そのものがC言語を実行ファイルへ変換するわけではありません。

MSYS2は、GCCやGTK 4をインストールし、それらが正しく動作できるように環境を整える役割を持っています。

項目MSYS2が担当するか
ソースファイルを編集する主な担当ではない
C言語をコンパイルするGCCが担当する
GUI部品を提供するGTK 4が担当する
開発ツールを導入する担当する
パッケージを更新する担当する
ターミナル環境を提供する担当する

MSYS2は、開発に必要な道具をそろえて管理するための基盤だと考えると分かりやすいでしょう。

MSYS2 UCRT64環境の役割

MSYS2には、目的の異なる複数の開発環境があります。本コンテンツでは、その中からUCRT64環境を使用します。

UCRT64環境では、WindowsのUniversal C Runtimeを利用するWindows向けプログラムを作成できます。UCRT64を起動すると、使用するコマンドやライブラリの検索先がUCRT64向けに設定されます。

MSYS2の公式ドキュメントでも、どの環境を選べばよいか分からない場合はUCRT64が案内されています。MSYS2の環境に関する公式ドキュメント

UCRT64環境を使用する主な理由は次のとおりです。

  • Windows向けのGCCを使用できる
  • UCRT64向けのGTK 4を使用できる
  • GCCとGTK 4の種類をそろえられる
  • Windowsで実行できるexeファイルを作成できる
  • GTK 4が必要とするヘッダーファイルやライブラリを見つけやすい

MSYS2では、環境ごとにインストールされるパッケージが分かれています。そのため、GCCだけをUCRT64環境へ入れ、GTK 4を別の環境へ入れるといった不ぞろいな状態は避ける必要があります。

本コンテンツでは、GCC、GTK 4、ターミナルのすべてをUCRT64に統一します。

GCCの役割

GCCは、C言語で書かれたソースファイルを、コンピューターが実行できる形式へ変換するためのコンパイラー群です。

C言語のソースファイルには、人間が読み書きしやすい命令が記述されています。しかし、WindowsはC言語のソースファイルをそのまま実行できません。

そこでGCCを使い、ソースファイルを機械が実行できる命令へ変換します。

GCCを実行すると、内部ではおおまかに次の処理が行われます。

  1. プリプロセス
  2. コンパイル
  3. アセンブル
  4. リンク

GCCの公式ドキュメントでも、通常のGCC呼び出しでは、前処理、コンパイル、アセンブル、リンクが順番に行われることが説明されています。

プリプロセス

プリプロセスでは、ソースファイルに書かれたヘッダーファイルの読み込みなどを処理します。

GTK 4を使うプログラムでは、GTK 4の関数やデータ型が宣言されたヘッダーファイルが必要になります。

コンパイル

コンパイルでは、プリプロセス後のC言語プログラムを、よりコンピューターに近い表現へ変換します。

この段階では、文法上の誤りや、型の扱いに関する問題なども確認されます。

アセンブル

アセンブルでは、コンパイルによって作られた内容をオブジェクトファイルへ変換します。

オブジェクトファイルには機械語が含まれていますが、通常はまだ単独で実行できません。

リンク

リンクでは、オブジェクトファイルと必要なライブラリを結び付けます。

GTK 4の関数を使用している場合は、GTK 4に関係するライブラリとの接続情報が必要です。リンクが完了すると、Windowsで起動できるexe形式の実行ファイルが作られます。

GTK 4の役割

GTK 4は、GUIアプリケーションを作成するためのライブラリです。

GTK 4を利用すると、次のようなGUI部品をC言語から扱えます。

  • ウィンドウ
  • ボタン
  • ラベル
  • 入力欄
  • メニュー
  • リスト
  • ダイアログ
  • 画像表示領域
  • レイアウト用のコンテナー

これらの画面部品は、一般にウィジェットと呼ばれます。

C言語の標準機能には、Windows上へボタンや入力欄を表示するための統一された機能がありません。GTK 4は、その不足しているGUI機能を提供します。

また、GTK 4はイベント駆動型の仕組みを備えています。ボタンのクリックなどを待ち受け、発生したイベントをアプリケーションへ伝えます。

ヘッダーファイルとライブラリの違い

GTK 4を使うときは、ヘッダーファイルとライブラリの両方が関係します。

種類役割
ヘッダーファイルGTK 4にどのような関数やデータ型があるかをGCCへ伝える
インポートライブラリリンク時にGTK 4の機能との接続情報を提供する
DLLアプリケーションの実行時にGTK 4の実際の処理を提供する

ヘッダーファイルを読み込んだだけでは、GTK 4の機能を備えた実行ファイルは完成しません。リンク時にはGTK 4のライブラリが必要になり、実行時にはGTK 4に関係するDLLが必要になります。

図2:MSYS2 UCRT64の中で連携するGCCとGTK 4

この図から分かること

GCCとGTK 4は、同じMSYS2 UCRT64環境の中でそろえて使用します。

GCCはソースファイルを処理し、GTK 4はGUIを作るためのヘッダーファイル、ライブラリ、DLLを提供します。両者を同じ環境にそろえることで、GCCがGTK 4に必要なファイルを正しく見つけられるようになります。

Visual Studio Codeの役割

Visual Studio Codeは、ソースファイルを作成、編集するためのコードエディターです。

本コンテンツでは、主に次の作業に使用します。

  • C言語のソースファイルを作成する
  • ソースコードを編集する
  • ファイルやディレクトリを管理する
  • 統合ターミナルを開く
  • MSYS2 UCRT64のコマンドを実行する
  • エラーが発生した場所を確認する
  • ビルド用の設定ファイルを作成する

C/C++拡張機能を追加すると、ソースコードの色分け、入力候補、情報表示、エラー確認など、C言語の編集を助ける機能を利用できます。

Visual Studio Codeはコンパイラーではない

Visual Studio Codeをインストールしただけでは、C言語のソースファイルをコンパイルできません。

Visual Studio Codeは編集作業を行う場所です。実際にソースファイルをコンパイルするのはGCCです。

統合ターミナルからGCCを実行できるため、見た目としてはVisual Studio Codeがコンパイルしているように感じるかもしれません。しかし、内部ではMSYS2 UCRT64環境のGCCが動いています。

作業担当するツール
ソースコードを書くVisual Studio Code
入力候補を表示するVisual Studio CodeのC/C++拡張機能
コマンドを入力する場所を提供するVisual Studio Codeの統合ターミナル
C言語をコンパイルするGCC
GTK 4のGUI機能を提供するGTK 4
GCCやGTK 4を管理するMSYS2

各ツールが連携する仕組み

開発中は、次のような流れで作業します。

  1. Visual Studio CodeでC言語のソースファイルを作成する
  2. ソースファイルを保存する
  3. Visual Studio Codeの統合ターミナルを開く
  4. MSYS2 UCRT64環境でGCCを実行する
  5. GCCがソースファイルとGTK 4の情報を読み取る
  6. GCCが必要なライブラリをリンクする
  7. Windows向けのexeファイルが作られる
  8. exeファイルを実行してGUI画面を確認する

Visual Studio CodeとMSYS2は、同じ目的のソフトウェアではありません。

Visual Studio Codeはコードを書く場所で、MSYS2 UCRT64はGCCやGTK 4を動かす環境です。Visual Studio Codeの統合ターミナルにMSYS2 UCRT64を登録すると、コードの編集とコンパイルをひとつの画面で進めやすくなります。

ソースファイルから実行ファイルが作られる流れ

C言語で記述したソースファイルは、そのままではWindows上で実行できません。

たとえば、これから作成するGUIプログラムのソースファイルを hello_gtk.c、完成する実行ファイルを hello_gtk.exeとすると、全体の流れは次のようになります。

段階主な入力主な処理得られるもの
1hello_gtk.cVisual Studio Codeで作成、保存するC言語のソースファイル
2ソースファイルとヘッダーファイルGCCが内容を確認して変換するオブジェクトコード
3オブジェクトコードとGTK 4のライブラリ必要な機能をリンクするhello_gtk.exe
4hello_gtk.exeと必要なDLLWindowsがプログラムを起動するGTK 4のウィンドウ

この段階では流れをつかめれば十分です。具体的なコンパイルコマンドやプログラムは、第3章と第4章で実際に確認します。

コンパイルとリンクは役割が異なる

コンパイルとリンクは、まとめて行われることが多いため、同じ処理のように見えます。しかし、それぞれの役割は異なります。

  • コンパイルは、C言語で書かれた内容を機械語へ近い形式に変換する処理
  • リンクは、変換された内容と必要なライブラリを結び付ける処理

GTK 4を使用するGUIアプリケーションでは、リンクが特に重要です。

ソースファイル内でGTK 4の関数を呼び出していても、その関数がどのライブラリにあるのか分からなければ、実行ファイルを完成させられません。リンクによって、プログラムとGTK 4の機能が結び付きます。

実行ファイルとDLLの関係

リンクが完了すると、Windows向けのexeファイルが作られます。ただし、GTK 4を使った実行ファイルでは、すべてのGTK 4の機能がexeファイルの中に直接入るとは限りません。

実行時には、GTK 4や関連ライブラリのDLLが読み込まれます。

開発環境では、MSYS2 UCRT64の中に必要なDLLがあり、検索できる状態になっているため、作成したアプリケーションを起動できます。

この関係は、第7章でアプリケーションを配布するときに重要になります。

  • 開発中はMSYS2 UCRT64内のDLLを利用できる
  • 配布先のパソコンにはMSYS2がない場合がある
  • 配布時には必要なDLLを実行ファイルと一緒に用意する
  • exeファイルだけをコピーしても起動できないことがある

この節では、実行ファイルの完成後にも、GTK 4の実行時ファイルが関係することを覚えておけば大丈夫です。

図3:ソースファイルからGUIアプリが起動するまで

この図から分かること

Visual Studio Codeで作成したソースファイルは、GCCによるコンパイルとリンクを経てexeファイルになります。

GTK 4は、コンパイル時にはヘッダーファイル、リンク時にはライブラリ、実行時にはDLLという形で関係します。完成したexeファイルを起動すると、Windowsが必要なDLLを読み込み、GTK 4のウィンドウやボタンが画面に表示されます。

開発環境で混同しやすいポイント

初めて環境を構築するときは、それぞれの役割が混ざって見えることがあります。次の点を区別しておくと、エラーが起きたときにも原因を探しやすくなります。

Visual Studio Codeを入れてもGCCは自動的に入らない

Visual Studio Codeはコードエディターです。C言語のコンパイラーは別に用意する必要があります。本コンテンツでは、MSYS2 UCRT64環境へGCCをインストールします。

GCCを入れてもGUI機能は自動的に入らない

GCCはC言語をコンパイルできますが、ウィンドウやボタンを作る機能を提供するものではありません。GUI機能を利用するためにGTK 4をインストールします。

GTK 4だけではプログラムを作れない

GTK 4はGUIライブラリです。ソースファイルを書くためのエディターや、実行ファイルを作るためのコンパイラーは別に必要です。

MSYS2とUCRT64は同じ意味ではない

MSYS2は開発環境全体を提供する仕組みです。UCRT64は、その中に用意されているWindows向け開発環境のひとつです。

本コンテンツでMSYS2のターミナルを使うときは、基本的にMSYS2 UCRT64ターミナルを選びます。

exeファイルができても必ず単独で動くとは限らない

GTK 4を利用したexeファイルは、実行時にGTK 4関連のDLLを必要とします。開発環境内で起動できても、別のパソコンへexeファイルだけを移動すると起動できない場合があります。

本コンテンツでの基本的な作業分担

これからの学習では、次の分担を意識して作業を進めます。

やりたいこと使用するもの
ソースファイルを作成するVisual Studio Code
ソースコードを保存するVisual Studio Code
コマンドを入力するMSYS2 UCRT64 Bash
GCCやGTK 4をインストールするMSYS2のpacman
C言語をコンパイルするGCC
GUI部品を利用するGTK 4
実行ファイルを起動するWindows
コンパイルエラーを確認するGCCの表示とVisual Studio Code
配布に必要なDLLを用意するMSYS2 UCRT64環境内のファイル

それぞれの名前を一度に暗記する必要はありません。

まずは、Visual Studio Codeでソースファイルを作り、MSYS2 UCRT64環境のGCCがGTK 4と連携してexeファイルを作る、という大きな流れをつかんでおきましょう。次の節から、この開発環境をひとつずつWindowsへ導入していきます。