10.2 Cコンパイラ(gcc : GNU C compiler)
1.コンパイラの扱う各種ファイルの概要
CとC++のコンパイラは統合されています。どちらの場合も、入力ファイルは、プリプロセス、コンパイル、アセンブル、リンクの4つの処理ステージのうちの1つ以上のステージを踏んで処理されます。gccを起動すれば、これらの必要な過程が自動的に実行されます。gccというのは、実は「ドライバ」と呼ばれるプログラムであり、gcc自身はコンパイルなどの実作業を何も行なわず、gccの内部から、実際にコンパイル・アセンブル・リンクなどを行なうコマンドを呼び出すことによって、一連のコンパイル動作を行なっているのです。
コンパイラは、ソースファイル名の拡張子によってソースの言語を識別しますが、デフォルトの動作は、どちらの名前でコンパイラを使うかに依存しています。
- gcc
- プリプロセス済みの (.i) ファイルを C のファイルと仮定し、C スタイルのリンクを行います。
- g++
- プリプロセス済みの(.i) ファイルを C++ のファイルと仮定し、C++ スタイルのリンクを行います。
ソースファイル名の拡張子は、その言語が何であるかと、どのような処理が行われるべきかを示します。
- .h
- プリプロセッサファイルです。通常はコマンドライン には現れません。
- .c
- C言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。
- .C
- C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。
- .cc
- C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。
- .cxx
- C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。
- .m
- Objective-C言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。
- .i
- プリプロセッサにかけられたC言語ソースです。コンパイラ、アセンブラにかけられます。
- .ii
- プリプロセッサにかけられたC++言語ソースです。コンパイラ、アセンブラにかけられます。
- .s
- アセンブリ言語ソースです。アセンブラにかけられます。
- .S
- アセンブリ言語ソースです。プリプロセッサ、アセンブラにかけられます。
- ??
- その他の(解釈されない)拡張子を持つファイルはリンカに渡されます。
以下のファイルも同様です。
- .o
- オブジェクトファイルです。
- .a
- アーカイブファイルです。
リンクは、オプション -c, -S, -E を指定して抑制しないかぎり(もしくはコンパイルエラーによってすべての処理が中断しないかぎり)、常に最終ステージで実行されます。リンクのステージにおいては、ソースファイルに対応した全ての .o ファイルと、-l で指定したライブラリと、理解できなかったファイル名(名前に .o のついたオブジェクトファイルや .a のついたアーカイブを含む) は、コマンドラインに並べられた順番でリンカに渡されます。