GCC の簡単な使用方法
出典: Knatech
ここでは、GCC の簡単な使用方法について説明します。
目次 |
GNU コンパイラ (GCC) について
GCC (GNU Compiler Collection) は、C 言語および C++ 言語のコンパイラです。多くの Linux PC には標準でインストールされています。
Windows 版は Cygwin または MinGW に含まれており、フリーソフトウェアとして入手できます。
gcc とともによく利用されるツールは以下のとおりです。
- g++ - C++ 言語コンパイラ、リンカ
- make - 自動ビルドツール
- gdb - デバッガ
- ar - アーカイバ (ライブラリ生成)
- as - アセンブラ
Windows では、DLL 作成のために dlltool、dllwrap などが使われることもあります。
簡単なコンパイル例
ここでは、おなじみ Hello, World! プログラムをコンパイルする方法を説明します。まず以下のプログラムを作成してください。Windows ではメモ帳などのテキストエディタを使ってください (Word や ワードパッドはだめです)。
hello.c:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello, World!\n");
return 0;
}
次にコンパイルを行います。Linux では任意のターミナルを開いてください。Windows (MinGW) では、コマンドプロンプトまたは rxvt (M のアイコン) を開きます。
以下のコマンドを実行してください。「$」記号はプロンプトを表します (この記号は入力しないでください)。
$ cd (hello.c があるディレクトリ) $ gcc hello.c -o hello
コマンドの意味は、hello.c をコンパイルして、「-o」で指定される hello という名前の実行ファイルを生成しなさい、です。Windows では拡張子「exe」が付加されます。
コンパイルの後、実行ファイルを以下のようにして実行させます。
$ hello Hello, World!
環境によっては、以下のような入力になります。
$ ./hello Hello, World!
分割コンパイル
比較的大きなプログラムを作る場合は、分割コンパイルの概念を知っておく必要があります。分割コンパイルは、複数のソースファイルがあるとき、それぞれを個別にコンパイルし、最終的にこれらをリンクして、1 つの実行ファイルを生成します。
図に示した一連のコンパイル作業は、以下のように行います。
$ gcc -c morning.c $ gcc -c afternoon.c $ gcc -c evening.c $ gcc morning.o afternoon.o evening.o -o allday
上の 3 行は、ソースファイルをコンパイルしてオブジェクトファイルを生成します。「-c」を指定していることに注意してください。最後の行は、3 つのオブジェクトファイルをリンクして、allday という実行ファイルを生成します。
Makefile の利用
分割コンパイルは、コマンドをたくさん打ち込む必要があるので、負担がかかるかもしれません。しかし、これを自動化すると、負担が減って幸せになるでしょう。
バッチファイルやシェルスクリプトを利用すれば、あらがじめ記録した複数のコマンド行を、自動的に実行できます。しかし多くの開発者はその選択肢を選びません。例えば、ソースファイルが 50 個あったときに、たった 1 つのファイルの、しかも 1 行だけ修正しただけで、毎回すべてのファイルをコンパイルするのは常識的ではありません。
Makefile は、修正を加えたソースファイルしかコンパイルしません。しかしリンクはしっかり行います。すなわち必要十分条件を兼ね備えているのです。
Makefile:
1: TARGET = allday 2: CFLAGS = -g 3: OBJS = morning.o afternoon.o evening.o 4: 5: all : $(TARGET) 6: 7: $(TARGET) : $(OBJS) 8: gcc $(OBJS) -o $@ 9: 10: .c.o : 11: gcc $(CFLAGS) -c $<
行番号は便宜上付けています。実際には打ち込まないでください。
1 ~ 3 行目は、マクロ変数の設定を行っています。例えば、TARGET の右辺の値 allday が、後の $(TARGET) と置き換わります。以下は変数の簡単な説明です。
- TARGET: 生成する実行可能ファイル名 (*.exe)
- CFLAGS: コンパイルオプション (-g はデバッグビルドを表す)
- OBJS: オブジェクトファイル群 (*.o)
5 行目からは、リンキングとコンパイルの処理を再帰的に記述しています。
5 行目:
- 実行ファイル $(TARGET) が最新のものかどうかを調べる。
- 最新であれば終了。そうでなければ 7 行目を実行。
7 行目:
- オブジェクトファイル群 $(OBJS) が最新のものかどうかを調べる。
- 最新であれば、オブジェクトファイル群をリンクする。そうでなければ 10 行目を実行。
10 行目:
- ソースファイル (.c) をコンパイルしてオブジェクトファイル (.o) にする。
なお、メイクファイル中の、「$@」は $(TARGET) と置き換わり、「$<」は現在処理中のソースファイルと置き換わります。
メイクファイルは Makefile という名前 (拡張子なし、M だけ大文字) で作成します。「gcc」の前には、必ずタブ文字を入れてください (コピーする場合は注意)。2 箇所あります。
なお、GNU Make の場合、8 行目以降は省略しても正常に動作します。
Makefile を処理させるために、make という自動ビルドツールを使用します。引数は今回必要ありません。実行するディレクトリに「Makefile」という名前のファイルがあれば、それがツールによって解釈されます。
$ make gcc -c morning.c gcc -c afternoon.c gcc -c evening.c gcc morning.o afternoon.o evening.o -o allday

