C言語+MySQL入門|簡潔な方法でコンパイルする

C言語+MySQL入門|簡潔な方法でコンパイルする

前回は、画面にメッセージを表示するプログラムを作り、C:\c-mysql\chap02にhello.cとして保存しました。

ただし、hello.cはプログラムの内容を文字で記述したソースファイルです。Windows上で実行するには、GCCを使って実行ファイルを作る必要があります。

この記事では、次のコマンドでhello.exeを作ります。

gcc hello.c -o hello.exe

まずは、この短いコマンドで「C言語のソースファイルから実行ファイルを作る」という流れをつかみましょう。C17の指定や警告の表示については、次の記事で扱います。

この記事で確認する内容は、次のとおりです。

  • コンパイルによって何が作られるのか
  • UCRT64ターミナルで作業ディレクトリへ移動する方法
  • gcc hello.c -o hello.exeの意味
  • コンパイルが成功したことを確認する方法
  • エラーが表示されたときの確認ポイント

ソースファイルから実行ファイルを作る

C言語で書いたソースファイルは、人がプログラムの内容を読み書きするためのファイルです。

一方、実行ファイルには、コンピューターが処理を進めるための機械語などが含まれています。

今回扱う2つのファイルを整理しておきましょう。

ファイル名種類役割
hello.cソースファイルC言語で書いたプログラムを保存する
hello.exe実行ファイルWindows上で実行するプログラムを保存する

hello.cをGCCに渡すと、GCCが必要な変換や結合を行い、hello.exeを作ります。

普段の会話では、この実行ファイルを作る作業全体を「コンパイルする」と呼ぶことがあります。厳密には、コンパイルのほかに、後で説明するリンクなどの工程も含まれています。

図1:ソースファイルから実行ファイルを作る

この図から分かること

hello.cとhello.exeは、役割の異なるファイルです。

プログラムを修正するときはhello.cを編集します。その変更を実行ファイルに反映するには、もう一度GCCでコンパイルする必要があります。

hello.cを保存しただけでは、hello.exeの内容は変わりません。

コンパイルするプログラムを確認する

前回作成したhello.cを、VS Codeで開きましょう。

保存場所は次のとおりです。

C:\c-mysql\chap02\hello.c

プログラムの内容を、ここでも省略せずに掲載します。

学習開始のメッセージを表示するプログラム

ファイル名: hello.c

#include <stdio.h>

int main(void)
{
    /* 学習開始のメッセージを表示する */
    printf("Hello, C and MySQL!\n");

    return 0;
}

このプログラムでは、printfを使ってメッセージを表示します。

記述役割
#include <stdio.h>printfなどの標準入出力関数の宣言を利用できるようにする
int main(void)プログラムの開始位置となるmain関数を定義する
/* 学習開始のメッセージを表示する */プログラムの説明をコメントとして残す
printf("Hello, C and MySQL!\n");メッセージを表示し、最後に改行する
return 0;プログラムが正常に終了したことを実行環境へ伝える

メッセージにはMySQLという名前が含まれていますが、まだデータベースへの接続は行いません。今回は、Cプログラムから実行ファイルを作ることに集中しましょう。

内容を確認したら、Ctrl + Sで保存してください。GCCが読み込むのは、ディスクに保存されているhello.cです。保存前の編集内容はコンパイルに反映されません。

UCRT64ターミナルで作業場所へ移動する

MSYS2 UCRT64を起動してください。前の記事で設定した、VS Code内のUCRT64ターミナルを使ってもかまいません。

使用中の環境を確認したいときは、次のコマンドを実行します。

echo $MSYSTEM

表示例は次のとおりです。

UCRT64

続いて、hello.cを保存したディレクトリへ移動します。

cd /c/c-mysql/chap02

Windowsのパスと、MSYS2で使うパスの対応は次のとおりです。

環境パス
WindowsC:\c-mysql\chap02
MSYS2 UCRT64/c/c-mysql/chap02

現在の作業ディレクトリは、pwdで確認できます。

pwd

表示例

/c/c-mysql/chap02

さらに、hello.cがあることを確認しましょう。

ls -1 hello.c

表示例

hello.c

ここでファイルが見つからなければ、VS Codeでの保存場所やファイル名を確認してください。

最小限のコマンドでコンパイルする

準備ができたら、UCRT64ターミナルに次のコマンドを入力し、Enterキーを押します。

gcc hello.c -o hello.exe

コマンドは、次のように読み取れます。

部分意味
gccGCCを起動する
hello.c入力として読み込むソースファイルを指定する
-o出力ファイル名を指定するオプション
hello.exe作成する実行ファイルの名前を指定する

-oの文字は、数字の0ではなく、小文字のアルファベットのoです。

GCCでは、-oの後ろに出力先のファイル名を指定します。今回は、hello.cを入力として読み込み、hello.exeという名前で実行ファイルを作ります。gcc.gnu.org

hello.cとhello.exeをディレクトリ名なしで指定しているため、どちらも現在の作業ディレクトリを基準に扱われます。

今回の作業場所は/c/c-mysql/chap02なので、作成されるファイルのWindows上の保存先は次のようになります。

C:\c-mysql\chap02\hello.exe

1つのコマンドで必要な工程が進む

gcc hello.c -o hello.exeを実行すると、GCCは必要な工程を順番に進めます。

大まかには、次の4段階です。

工程行うこと
前処理#includeなどの指示を処理する
コンパイルC言語のコードをアセンブリコードへ変換する
アセンブルアセンブリコードを機械語を含むオブジェクトコードへ変換する
リンクオブジェクトコードと必要なライブラリを結び付け、実行ファイルを作る

これらの工程は、GCCの1回の呼び出しで進められます。今回のように実行ファイルを作る場合、各工程のコマンドを個別に入力する必要はありません。

また、今回使っているprintfはCの標準ライブラリの関数です。通常のGCCによるリンクでは標準ライブラリが自動的に扱われるため、このプログラムのためにMySQL用やGTK 4用のライブラリを指定する必要はありません。

図2:GCCが実行ファイルを作るまでの工程

この図から分かること

普段「コンパイルする」と呼んでいる作業には、複数の工程が含まれます。

今は工程ごとの細かな仕組みを覚えなくても大丈夫です。gcc hello.c -o hello.exeによって、ソースファイルを読み込むところから実行ファイルを作るところまで進む、と理解しておきましょう。

コンパイルの成功を確認する

何も表示されずに入力待ちへ戻ることがある

今回のプログラムでは、コンパイルが成功すると、通常はメッセージを表示せずにターミナルが次の入力を待つ状態へ戻ります。

「成功しました」と表示されなくても、それだけで失敗とは限りません。

また、コンパイルした時点では、次のメッセージも表示されません。

Hello, C and MySQL!

これはhello.exeを実行したときに表示される文字列です。コンパイルは実行ファイルを作る作業なので、プログラムを動かす操作とは分けて考えましょう。

終了ステータスを確認する

コンパイル直後に、次のコマンドを実行します。

echo $?

成功した場合の表示例

0

Bashの$?には、直前に実行したコマンドの終了ステータスが入っています。GCCが正常に終了すると、0になります。

GCCの結果を確認するときは、間に別のコマンドを実行せず、コンパイルの直後に確認してください。

例えば、先にlsを実行すると、その後のecho $?はlsの終了ステータスを表示します。

hello.exeが作られたことを確認する

続いて、ソースファイルと実行ファイルを確認します。

ls -1 hello.c hello.exe

表示例

hello.c
hello.exe

hello.cが残り、新しくhello.exeが作られていることが分かります。コンパイルしても、ソースファイルが実行ファイルに置き換わって消えるわけではありません。

なお、以前にコンパイルしたhello.exeが残っている場合もあります。ファイルが存在することだけで判断せず、今回のGCCのエラーメッセージや終了ステータスも確認しましょう。

実行したときに表示される内容

実行結果の例

今回作成したhello.exeを後の記事で実行すると、次のように表示されます。

Hello, C and MySQL!

printfの文字列の末尾にある\nによって、メッセージの後ろで改行されます。

return 0;の0は、画面に表示するための値ではありません。プログラムの終了状態を伝える値なので、この実行結果に0という文字が追加されることはありません。

この記事ではhello.exeの作成までを確認し、実行操作は「プログラムを実行する」の記事で詳しく扱います。

エラーが表示されたときの確認ポイント

コンパイルがうまくいかないときは、表示されたメッセージを手掛かりに確認していきましょう。文言は環境によって多少異なる場合があります。

表示されるメッセージの例考えられる原因確認すること
gcc: command not foundGCCが見つからないUCRT64ターミナルを使っているか、UCRT64用GCCを導入したか
hello.c: No such file or directory指定したソースファイルが見つからない現在の作業場所、保存先、ファイル名
expected ...C言語の文法に合わない記述があるセミコロン、括弧、二重引用符など
cannot open output file hello.exe: Permission denied出力先へ書き込めないhello.exeが実行中ではないか、保存先へ書き込めるか

特に最初は、次の点を確認すると原因を見つけやすくなります。

  • hello.cを保存してからコンパイルしたか
  • ファイル名がhello.c.txtになっていないか
  • 作業ディレクトリが/c/c-mysql/chap02になっているか
  • コード中の記号に全角文字が混ざっていないか
  • printfの行やreturnの行の末尾にセミコロンがあるか

エラーを修正したら、Ctrl + Sで保存し、同じコマンドをもう一度実行してください。

gcc hello.c -o hello.exe

修正したら、保存してから作り直す

今後プログラムを変更するときも、基本の流れは同じです。

  1. VS Codeでhello.cを編集する。
  2. Ctrl + Sで保存する。
  3. UCRT64ターミナルでコンパイルする。
  4. エラーがないことを確認する。

同じ出力ファイル名を指定してコンパイルが成功すると、hello.exeが更新されます。

コンパイルに失敗した場合、以前のhello.exeが残ることもあります。そのため、エラーが出た状態で実行ファイルだけを動かしても、最新の編集内容を確認できるとは限りません。

図3:編集内容を実行ファイルへ反映する流れ

この図から分かること

編集、保存、コンパイルは、それぞれ別の操作です。

VS Codeで変更した内容は、保存するとhello.cに反映されます。その保存済みの内容をGCCでコンパイルすることで、hello.exeにも変更が反映されます。

「修正したら、保存してコンパイルする」という流れを、ここで身に付けていきましょう。

次は警告を表示してコンパイルする

今回使用したコマンドは、入力ファイルと出力ファイルを指定する簡潔な形でした。

gcc hello.c -o hello.exe

このコマンドでは、C言語の規格を明示的に指定していないため、使用しているGCCの既定の設定が適用されます。

次の記事では、次のコマンドを使います。

gcc -std=c17 -Wall -Wextra -Wpedantic hello.c -o hello.exe

C17を指定し、問題につながりそうな記述を警告で見つけやすくする方法を学びます。今回hello.exeを作れたことを土台にして、プログラムの書き間違いに気付きやすいコンパイル方法へ進みましょう。

Follow me!