C言語では、まずはソースコードはプリプロセッサにより前処理をされます。
詳しくは、下記の記事で解説をしています。
その次に、「コンパイラ」による処理に引き継がれることになります。
コンパイラの役割
プリプロセッサが出力した内容をチェックして、マシン後に翻訳をします。
その結果、オブジェクトファイルというファイルが生成されます。(なお、OSごとに生成されるオブジェクトファイルは互換性がないので注意です。Windowsで生成したオブジェクトファイルはLinuxでは動かないなど)
例えば、「test.c」というファイルをコンパイルした場合は「test.o」というオブジェクトファイルが生成されます。
ただ、この状態ではまだ、あくまでヘッダファイルのプロトタイプ宣言だけ変換しているので、未完成の状態であり、実行可能ではありません。
コンパイラの動作
なお、コンパイル自体は各ソースファイルごとに完全に独立して行われます。
コンパイラ
OSSからいろいろなベンダーがC言語コンパイラを開発しておりフリーだったり商用だったりとさまざまな種類があります。
Unix系のフリーコンパイラ
- gcc
- clang(FreeBSDなどではデフォルト)
Linuxではgccかclangをyumなどで別途インストールが必要になります。
Windowsで使えるコンパイラ
- MinGW(gcc)
- Eclipse CDT
なお、Mac OSではデフォルトでCのコンパイラがインストールされています。
商用コンパイラ
- Intel ICC
リンカ
コンパイルが終わった段階では、プロトタイプ宣言のみの状態の関数が定義されたままです。そこで登場するのがリンカになります。
リンカの役割
まだ、プロトタイプ宣言しかない関数については、実体を含むオブジェクトファイルを結合して最終的な実行可能ファイルを作ります。
ただ、実行可能ファイルを作る場合は、必ずmain関数を含むオブジェクトファイルが必要になります。
実行形式ファイルにはリンカによってその他スタートアップルーチンも結合されます。スタートアップルーチンはOSのシェルによって読み込まれて実行される処理の部分で、どのようなプログラムにも共通して呼び出されます。
リンカの動作
複数ソースファイル全体で、どんなグローバル変数やグローバル関数が定義されているかチェックします。
もし、各ソースファイルで、変数や関数の二重定義があった場合はリンクエラーが発生します。
この記事へのコメントはありません。