C言語ソースコードをコンパイルする

C言語ソースコードをコンパイルしてみましょう。ここで解説するのは、C言語ソースコードからオブジェクトファイルを生成する、純粋なコンパイルです。

オブジェクトファイルは、機械語で書かれたプログラムの部品のことだと考えてください。

コンパイルとは、テキストで書かれたC言語ソースファイルを、機械語で書かれたオブジェクトファイルに変換する作業のことです。

コンパイルを行うには「-c」オプションを使用します。

# C言語ソースファイルをコンパイルする
gcc -c 入力ソースコードファイル名

「test.c」というファイルから「test.o」というオブジェクトファイルを生成してみましょう。

// test.c

#include <stdio.h>

int main(void) {
  printf("Hello World!\n");
}

gccコマンドを実行します。「test.o」というオブジェクトファイルが生成されます。

gcc -c test.c

出力ファイル名を自分で指定したい場合は「-o」オプションが使用できます。

gcc -o test2.o -c test.c 

リンクを行ってオブジェクトファイルから実行ファイルを生成する

ひとつのオブジェクトファイルから実行ファイルを生成してみましょう。この作業をリンクと呼びますが、ひとつのオブジェクトファイルから、ひとつの実行ファイルを生成するので、リンクという感じはしません。

先ほど生成したオブジェクトファイル「test.o」から実行ファイル「test」を生成します。

# オブジェクトファイルから実行ファイルを生成する
gcc -o test test.o

「test」が実行ファイルとして実行できるかを確認してみましょう。

./test

複数のオブジェクトファイルから一つの実行ファイルを生成できますか?

はい。複数のオブジェクトファイルから一つの実行ファイルを生成できます。

gcc -o test test.o foo.o bar.o

これについては、分割コンパイルの解説で行いたいと思います。

gcc以外のコンパイラは存在しますか?

gccは、GNUプロジェクトによって作成された、UNIX/LinuxのデフォルトのC言語コンパイラだと考えてください。

他のメーカーで作成されているC言語コンパイラがあり、コンパイル速度、リンク速度、実行速度の点で、優れている場合があります。

UNIX/Linuxにおけるポータビリティやオープンソース文化への親和性という点で、gccは優れていると考えます。

企業製品の場合は、広告メッセージが誇大である場合も多く、もともと存在する製品が用途的に十分使える場合であっても、企業支配力を増加させることが、開発の動機になっていることもあるので、その点を差し引いて品質評価を行うと良いと思います。

関連情報