
C言語GUI入門|開発環境の全体構成
この記事の概要
C言語でGUIアプリケーションを開発するときは、ひとつのソフトウェアだけですべての作業を行うわけではありません。
本コンテンツでは、Windows上に次の開発環境を用意します。
- MSYS2
- GCC
- GTK 4
- Visual Studio Code
- MSYS2 UCRT64環境
Visual Studio Codeでソースファイルを作成し、MSYS2 UCRT64環境でGCCを動かします。GCCは、GTK 4の機能を利用しながらソースファイルを実行ファイルへ変換します。
それぞれのツールには、はっきりとした役割があります。
| ツール | 主な役割 |
|---|---|
| Windows | GUIアプリケーションを開発、実行するOS |
| MSYS2 | 開発ツールやライブラリを導入し、利用できる環境を整える |
| GCC | C言語のソースファイルをコンパイル、リンクする |
| 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を実行すると、内部ではおおまかに次の処理が行われます。
- プリプロセス
- コンパイル
- アセンブル
- リンク
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 |
各ツールが連携する仕組み
開発中は、次のような流れで作業します。
- Visual Studio CodeでC言語のソースファイルを作成する
- ソースファイルを保存する
- Visual Studio Codeの統合ターミナルを開く
- MSYS2 UCRT64環境でGCCを実行する
- GCCがソースファイルとGTK 4の情報を読み取る
- GCCが必要なライブラリをリンクする
- Windows向けのexeファイルが作られる
- 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とすると、全体の流れは次のようになります。
| 段階 | 主な入力 | 主な処理 | 得られるもの |
|---|---|---|---|
| 1 | hello_gtk.c | Visual Studio Codeで作成、保存する | C言語のソースファイル |
| 2 | ソースファイルとヘッダーファイル | GCCが内容を確認して変換する | オブジェクトコード |
| 3 | オブジェクトコードとGTK 4のライブラリ | 必要な機能をリンクする | hello_gtk.exe |
| 4 | hello_gtk.exeと必要なDLL | Windowsがプログラムを起動する | 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へ導入していきます。
