コンパイルとリンク

機械語への変換処理

C言語のみならず、コンパイラ言語はソースプログラムを 機械語に翻訳してそれを実行ファイルとする。今までのプログラミング作業から 見るとコンパイルの行程は

ソースプログラム
(C言語)
コンパイル
実行プログラム
(機械語)

のように1段階に感ずるが、本来は以下のような行程を経ている。

ソースプログラム
(C言語)
コンパイル
オブジェクトプログラム
(機械語; 実行不可)
リンク
実行プログラム
(機械語; 実行可能)

「コンパイル」は文字通り「翻訳」という意味で、C言語で書かれたものを そのままの意味で機械後に変換する。単純に機械後に翻訳しただけのものを オブジェクトプログラムといい、そのままでは実行できない。 プログラムの実行に必要な初期化処理や、printf, fgets などの システムで用意された関数の実体をオブジェクトプログラムと結合する ことで初めて実行プログラムとして利用できるようになる。この結合処理を リンク という。

printf, fgets などの自分で定義しなくても使える関数の 実体の多くは /usr/lib/libc.* ファイルに格納されている。 システムで定義された関数群はライブラリ関数 という。

オブジェクトプログラムは、通常 .o (小文字のオー)で 終わるファイル名になる。Cのソースファイルをコンパイルだけして、オブジェ クトファイルにするには gcc-c オプションを 用いる。

ls
foo.c
gcc -c foo.c
ls
foo.c     foo.o

コンパイルとリンクを分ける意味

実用的なプログラムは非常に大きなものになるので、通常は複数の ファイルに分けて作る。このようなときには、個々のC言語ソースファイルを コンパイルだけして、最後にリンクする。

              コンパイル                 リンク
[program1.c] ------------ [program1.o] ------`.
[program2.c] ------------ [program2.o] --------`.
[program3.c] ------------ [program3.o] ----------+-- program
[program4.c] ------------ [program4.o] --------,'
[program5.c] ------------ [program5.o] ------.'

コンパイル作業は、ソースプログラムのエラーの検出など含まれるので、 あまり一つのソースプログラムが大きいと処理に時間がかかる。また、 多人数でプログラムを開発する場合には、別々のファイルに分けることで 分業化しやすい。これらの理由により、本格的なプログラムはコンパイルと リンクの2段階に分けて開発を行なう。


目次