ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris Studio 12.3: C++ ユーザーズガイド Oracle Solaris Studio 12.3 Information Library (日本語) |
この節では、プログラムのコンパイルとリンクについていくつかの側面から説明します。次の例では、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) はそのまま残ります。この規則により、ファイルの再リンクと再コンパイルを簡単に行えます。
注 - ソースファイルが 1 つだけであるプログラムに対してコンパイルとリンクを同時に行なった場合は、対応する .o ファイルが自動的に削除されます。複数のソースファイルをコンパイルする場合を除いて、すべての .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 (未定義の外部参照がある)」エラーで、ルーチンがないために失敗します。
コンパイルとリンクを別々に実行する場合で、「3.3.3 コンパイル時とリンク時のオプション」に示すコンパイラオプションを使用する場合は、コンパイルとリンクの整合性を保つことは非常に重大な意味を持ちます。
これらのオプションのいずれかを使用してサブプログラムをコンパイルした場合は、リンクでも同じオプションを使用してください。
-library オプションまたは -m64 /-m32 オプションを使用してコンパイルする場合、これらの同じオプションをすべての CC コマンドに含める必要があります。
-p、-xpg、-xprofile オプションの場合、ある段階ではオプションを指定して別の段階では指定しないと、プログラムの正しさには影響はありませんが、プロファイル処理ができなくなります。
-g、-g0 オプションの場合、ある段階ではオプションを指定して別の段階では指定しないと、プログラムの正しさには影響はありませんが、プログラムを正しくデバッグできなくなります。これらのオプションでコンパイルされず、-g または -g0 でリンクされるモジュールはどれも、デバッグ用に正しく準備されません。--g オプション (または -g0 オプション)付きの 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 ライブラリを使用します。結果として得られたプログラムは正常にリンクできず、どのような状況でも正常に動作しません。
プログラムがテンプレートを使用する場合は、リンク時に一部のテンプレートがインスタンス化される可能性があります。その場合、インスタンス化されたテンプレートは最終行 (リンク行) のコマンド行オプションを使用してコンパイルされます。
-m64 オプションを使用して、ターゲットプラットフォームの 64 ビットメモリーモデルを指定します。64 ビットオブジェクトのコンパイル、リンク、および実行は、64 ビット実行をサポートする Oracle Solaris または Linux プラットフォームでのみ行うことができます。
-V オプションを指定すると、CC によって起動された各プログラムの名前とバージョン番号が表示されます。-v オプションを指定すると、CC によって起動されたコマンド行全体が表示されます。
—verbose=%all を指定すると、コンパイラに関する追加情報が表示されます。
コマンド行に指定された引数をコンパイラが認識できない場合には、それらはリンカーオプション、オブジェクトプログラムファイル名、ライブラリ名のいずれかとみなされます。
基本的には次のように区別されます。
認識できない非オプション (先頭にダッシュかプラス符号 (+) が付いていないもの)には、警告が生成されません。ただし、リンカーへ渡されます。リンカーが認識しない場合は、リンカーエラーメッセージが生成されます。
次の例で、-bit は CC によって認識されないため、リンカー (ld) に渡されます。リンカーはこれを解釈しようとします。単一文字の ld オプションは連続して指定できるので、リンカーは -bit を -b、-i、-t とみなします。これらはすべて有効な ld オプションです。この結果は意図または期待したものとは異なる可能性があります。
example% CC -bit move.cc -bit is not a recognized compiler option CC: Warning: Option -bit passed to ld, if ld is invoked, ignored otherwise
次の例では、CC オプション -fast を指定しようとしましたが、先頭のダッシュ (-) を入力しませんでした。コンパイラはこの引数もリンカーに渡します。リンカーはこれをファイル名とみなします。
example% CC fast move.cc < - The user meant to type -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 オプションを使用します。
次の表に示すように、コンパイラの構成要素への入力ファイルには異なるファイル名接尾辞が付いています。どのようなコンパイルを行うかは、この接尾辞で決まります。ファイル名接尾辞の意味については、表 2-1 を参照してください。
表 2-2 C++ コンパイルシステムの構成要素
|