コンパイルとリンク
機械語への変換処理
C言語のみならず、コンパイラ言語はソースプログラムを
機械語に翻訳してそれを実行ファイルとする。今までのプログラミング作業から
見るとコンパイルの行程は
のように1段階に感ずるが、本来は以下のような行程を経ている。
「コンパイル」は文字通り「翻訳」という意味で、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段階に分けて開発を行なう。
目次