このセクションでは、プログラムのコンパイルとリンクについていくつかの側面から説明します。次の例では、CC を使って 3 つのソースファイルをコンパイルし、オブジェクトファイルをリンクして prgrm という実行可能ファイルを作成します。
example% CC file1.cc file2.cc file3.cc -o prgrm
前の例では、コンパイラがローダーオブジェクトファイル (file1.o、file2.o、file3.o) を自動的に生成し、次にシステムリンカーを起動してファイル prgrm の実行可能プログラムを作成します。
コンパイル後も、オブジェクトファイル (file1.o、file2.o、および file3.o) はそのまま残ります。この規則により、ファイルの再リンクと再コンパイルを簡単に行えます。
コンパイルが失敗すると、エラーごとにメッセージが返されます。エラーがあったソースファイルの .o ファイルは生成されず、実行可能プログラムも作成されません。
コンパイルとリンクは別々に行うことができます。-c オプションを指定すると、ソースファイルがコンパイルされて .o オブジェクトファイルが生成されますが、実行可能ファイルは作成されません。-c オプションを指定しないと、コンパイラはリンカーを起動します。コンパイルとリンクを分離すれば、1 つのファイルを修正するためにすべてのファイルを再コンパイルする必要はありません。次の例では、最初の手順で 1 つのファイルをコンパイルし、次の手順でそれをほかのファイルとリンクします。
example% CC -c file1.cc Make new object file example% CC -o prgrm file1.o file2.o file3.o Make executable file
リンク時には (2 行目)、完全なプログラムを作成するのに必要なすべてのオブジェクトファイルを必ず 指定してください。オブジェクトファイルが足りないと、リンクは「undefined external reference (未定義の外部参照がある)」エラーで、ルーチンがないために失敗します。
コンパイルとリンクを別々に実行する場合で、コンパイル時とリンク時のオプションに示すコンパイラオプションを使用する場合は、コンパイルとリンクの整合性を保つことは非常に重大な意味を持ちます。
これらのオプションのいずれかを使用してサブプログラムをコンパイルした場合は、リンクでも同じオプションを使用してください。
-library オプションまたは -m64 /-m32 オプションを使用してコンパイルする場合、これらの同じオプションをすべての CC コマンドに含める必要があります。
-compat オプションまたは -std オプションを使用してコンパイルする場合、同じまたは同等のオプションをすべての CC コマンドに含める必要があります。たとえば、-compat=5 と -std=sun03 は同等です。
-p、-xpg、-xprofile オプションの場合、ある段階ではオプションを指定して別の段階では指定しないと、プログラムの正しさには影響はありませんが、プロファイリングができなくなります。
-g[n] および -xdebuginfo を使用して、1 つのフェーズにそのオプションを取り込み、ほかのフェーズからそのオプションを除外すると、プログラムの正確さには影響しませんが、プログラムをデバッグする機能に影響します。これらのオプションのいずれかでコンパイルされず、-g[n] または -xdebuginfo とリンクされているモジュールは、デバッグ用に正しく作成されません。デバッグには、通常、–g[n] オプションまたは -xdebuginfo オプションを指定して関数 main を含むモジュールをコンパイルする必要があります。
次の例では、-library=stlport4 コンパイラオプションを使用してプログラムをコンパイルしています。
example% CC -library=stlport4 sbr.cc -c example% CC -library=stlport4 main.cc -c example% CC -library=stlport4 sbr.o main.o -o myprogram
-library=stlport4 を一貫して使用しない場合は、プログラムの特定の部分はデフォルトの libCstd を使用し、ほかの部分はオプションの置換である STLport ライブラリを使用します。結果として得られたプログラムは正常にリンクできず、どのような状況でも正常に動作しません。
プログラムがテンプレートを使用する場合は、リンク時に一部のテンプレート がインスタンス化される可能性があります。その場合、インスタンス化されたテンプレートは最終行 (リンク行) のコマンド行オプションを使用してコンパイルされます。
-V オプションを指定すると、CC によって起動された各プログラムの名前とバージョン番号が表示されます。-v オプションを指定すると、CC によって起動されたコマンド行全体が表示されます。
—verbose=%all を指定すると、コンパイラに関する追加情報が表示されます。
コマンド行に指定された引数をコンパイラが認識できない場合には、それらはリンカーオプション、オブジェクトプログラムファイル名、ライブラリ名のいずれかとみなされます。
基本的には次のように区別されます。
認識できない非オプション (先頭にダッシュかプラス符号 (+) が付いていないもの)には、警告が生成されません。ただし、リンカーへ渡されます。リンカーが認識しない場合は、リンカーエラーメッセージが生成されます。
次の例で、-bit は CC によって認識されないため、リンカー (ld) に渡されます。リンカーはこれを解釈しようとします。単一文字の ld オプションは連続して指定できるので、リンカーは -bit を -b、-i、-t とみなします。これらはすべて有効な ld オプションです。この結果は意図または期待したものとは異なる可能性があります。
example% CC -bit move.cc-bit は認識されるコンパイラオプションではありません CC: Warning: Option -bit passed to ld, if ld is invoked, ignored otherwise
次の例では、CC オプション -fast を指定しようとしましたが、先頭のダッシュ (-) を入力しませんでした。コンパイラはこの引数もリンカーに渡します。リンカーはこれをファイル名とみなします。
example% CC fast move.cc< - ユーザーは -fast と入力しようとしました move.CC: ld: fatal: file fast: cannot open file; errno=2 ld: fatal: File processing errors. No output written to a.out
C++ コンパイラパッケージは、フロントエンド (CC コマンド本体)、オプティマイザ (最適化)、コードジェネレータ (コード生成)、アセンブラ、テンプレートのプリリンカー (リンクの前処理をするプログラム)、リンクエディタから構成されています。コマンド行オプションでほかの指定を行わないかぎり、CC コマンドはこれらのコンポーネントをそれぞれ起動します 。
これらのコンポーネントはいずれもエラーを生成する可能性があり、コンポーネントはそれぞれ異なる処理を行うため、エラーを生成するコンポーネントを識別することが役立つことがあります。コンパイラ実行中に詳細を表示するには、-v および -dryrun オプションを使用します。
次の表に示すように、コンパイラのコンポーネントへの入力ファイルには異なるファイル名接尾辞が付いています。どのようなコンパイルを行うかは、この接尾辞で決まります。ファイルの接尾辞の意味については、表 1を参照してください。
|