基本的な C および C++ プログラム開発は、編集、コンパイル、およびリンク (デフォルトで、コンパイルと組み合わせられた単一ステップ)、 および実行の反復されるサイクルから成り立ちます。
典型的なコンパイラー呼び出しコマンドは、以下に挙げるプログラムのうちいくつか、 またはすべてを順序どおりに実行します。 リンク時の最適化については、フェーズの中のあるものは、 コンパイル中に複数回実行されます。 各々のプログラムが実行されるときに、結果が、 順序に並んでいるものの中の次のステップに送られます。
- プリプロセッサー
- 以下のフェーズから成り立つコンパイラー。
- フロントエンド構文解析およびセマンティック分析
- ループ変換
- プロシージャー間分析
- 最適化
- レジスター割り振り
- 最終アセンブリー
- アセンブラー (プリプロセスされた後の .s ファイルおよび .S ファイルについて)
- リンカー ld
コンパイラーがこれらのフェーズをステップスルーするのを見るためには、 ユーザーが自身のアプリケーションをコンパイルするときに、-qphsinfo および -v コンパイラー・オプションを指定します。
C および C++ ソース・プログラムを作成するには、vi または emacs といった、 使用可能な任意のテキスト・エディターを使用することができます。 構成ファイルが追加の非標準ファイル名サフィックスを または -qsourcetype コンパイラー・オプションが追加の非標準ファイル名サフィックスを定義するのでない限り、 ソース・プログラムは認識されたファイル名サフィックスを使用する必要があります。 XL C/C++ によって認識されたファイル名サフィックスのリストについては、XL C/C++ 入力ファイルを参照してください。
C または C++ ソース・プログラムが有効なプログラムであるためには、 そのソース・プログラムは、「XL C/C++ Advanced Edition V8.0 for Linux 言語解説書」に指定されている言語定義に準拠している必要があります。
ソース・プログラムをコンパイルするには、 次に示す構文をもつコンパイラー呼び出しコマンドのうちの 1 つを使用します。
>>-compiler_invocation------------------------------------------> .-----------------------------------------. | .---------------------. | V V | | >------+-----------------+-+----input_file---+----------------->< '-cmd_line_option-'
コンパイラー呼び出しコマンドは、C または C++ ソース・ファイルをコンパイルし、 任意の .s ファイルおよび .S ファイルをアセンブルし、 オブジェクト・ファイルとライブラリーを 1 つの実行可能プログラムにリンクするのに必要なすべての手順を実行します。
新規の C または C++ アプリケーションの作業については、xlC または xlc++、 またはスレッド・セーフでそれに対応するものを使用してコンパイルすることを考慮する必要があります。
xlC と xlc++ は両方ともプログラム・ソースを C かまたは C++ としてコンパイルしまが、C++ ファイルを xlc でコンパイルすると、C コンパイラーによってリンカーが呼び出されたときに C++ コードに必要なライブラリーが指定されていないために、 リンクまたはランタイムのエラーが生じる結果になることがあります。他の基本コンパイラー呼び出しコマンドは、 主として、C または C++ 言語のさまざまなレベルおよび拡張機能に対する明示的なコンパイル・サポートを提供するために存在します。
基本コンパイラー呼び出しコマンドに加えて、XL C/C++ は、また、 多くの基本コンパイラー呼び出しの、専門化されたバリアントを提供します。 基本コンパイラー呼び出しに対するバリエーションには、 その呼び出しコマンドの名前にサフィックスを付加することによって、名前が付けられます。 呼び出しのバリアントのサフィックスの意味は以下のとおりです。
XL C/C++ は、 マルチプロセッサー環境で使用される並列化アプリケーションをコンパイルするのに使用できるスレッド・セーフのコンパイル呼び出しを提供します。
- xlC_r
- xlc++_r
- xlc_r
- c99_r
- c89_r
- cc_r
これらの呼び出しは、 それらがコンパイルされたオブジェクトをスレッド・セーフ・コンポーネントおよびライブラリーにリンクしバインドすることを除いて、 対応する基本コンパイラー呼び出しと同様です。
コンパイラーへの入力ファイルには次のものがあります。
コンパイラーは、指定されたソース・ファイルをコマンド行で指定された順序でコンパイルします。 指定されたソース・ファイルが見つからない場合、 コンパイラーはエラー・メッセージを作成し、 次のファイルがあれば、そのファイルに進みます。
標準の C または C++ ファイル命名規則に準拠しない C または C++ ソース・ファイルをもっている場合には、-+ コンパイラー・オプションを使用して、コンパイラーに、 そのようなファイルを C または C++ ソース・ファイルとして扱うように指示することができます。 そのようなファイルは、-+ コンパイラー・オプションが有効である場合、.a、.o、.so、.s、または .S ファイル名サフィックスをもつものを除き、C++ ソース・ファイルとしてコンパイルされます。
インクルード・ファイルには、ソースも含まれており、 しばしば、通常 C または C++ ソース・ファイル用に使用されるものとは異なるサフィックスをもちます。
デフォルト構成ファイルは /etc/opt/ibmcmp/vac/8.0/vac.cfg および /etc/opt/ibmcmp/vac/8.0/gxlc.cfg です。
-qpdf1 オプションは、後続のコンパイルで使用されるランタイム・プロファイル情報を作成します。 この情報は、パターン .*pdf* に一致する名前をもった 1 つ以上の隠しファイルに保管されます。
C および C++ が作成する出力ファイルは以下のとおりです。
各 .u ファイルには、次のような一般的形で、 入力ファイル用に 1 行、および各インクルード・ファイル用に 1 つの項目が入っています。
file_name.o :file_name.c file_name.o :include_file_name
インクルード・ファイルは、#include プリプロセッサー・ディレクティブ用の、コンパイラー検索順序規則に従ってリストされます。 見つからない場合は、インクルード・ファイルは .u ファイルに追加されません。 include 文のないファイルは、 入力ファイル名だけをリストする 1 行が入っている出力ファイルを作成します。
コンパイラー・オプションは、コンパイラー特性の設定、 作成されるオブジェクト・コードの記述、 出される診断メッセージの制御、および一部のプリプロセッサー機能の実行など、 さまざまな機能を実行します。
コンパイラー・オプションは以下のようにユーザーが指定できます。
- コマンド行で、コマンド行コンパイラー・オプションを使用して
- コンパイラー構成ファイルにあるスタンザで
- ソース・コードでディレクティブ・ステートメントを使用して
- あるいは、これらの手法を任意に組み合わせたものを使用して
複数のコンパイラー・オプションを指定した場合、 オプションの競合および非互換が起きる可能性があります。 このような競合を整合性のある方法で解決するために、 コンパイラーは通常次の一般的な優先順位の順序を適用します。
- ソース・ファイルのディレクティブ・ステートメントは、コマンド行設定値を オーバーライド する。
- コマンド行コンパイラー・オプション設定値は、 構成ファイル設定値をオーバーライド する。
- 構成ファイル設定値は、デフォルト設定値をオーバーライド する。
一般に、コンパイラーを呼び出すときにコマンド行上で同じコンパイラー・オプションが複数回指定されると、 最後に指定されたオプションが優先されます。
累積的動作を行う他のオプションは、-R および (小文字の L) です。
コンパイラー・オプションをリンカー、アセンブラー、およびプリプロセッサーに渡すこともできます。 コンパイラー・オプションおよびそれらの指定の仕方に関する情報の詳細については、 『コンパイラー・オプションの参照』を参照してください。
デフォルトでは、ユーザーは、XL C/C++ プログラムをリンクするのに、特別なことは何もする必要はありません。 コンパイラー呼び出しコマンドは、自動的にリンカーを呼び出し、 実行可能出力ファイルを作成します。 たとえば、以下のコマンドを実行すると、
xlC file1.C file2.o file3.C
オブジェクト・ファイル file1.o および file3.o がコンパイルされ、作成され、次にすべてのオブジェクト・ファイル (file2.o も含まれる) がリンカーに処理依頼されて 1 つの実行可能モジュールが作成されます。
リンクが終了したならば、XL C/C++ プログラムの実行の指示に従ってプログラムを実行してください。
後でリンクできるオブジェクト・ファイルを作成するには、-c オプションを使用します。
xlc++ -c file1.C # 1 つのオブジェクト・ファイル (file1.o) を作成する xlc++ -c file2.C file3.C # または複数のオブジェクト・ファイル (file1.o、 file3.o) を作成する xlc++ file1.o file2.o file3.o # オブジェクト・ファイルを該当するライブラリー にリンクする
コンパイラー呼び出しコマンドを介してリンカーを実行するのが最適な場合もあります。 このコマンドは、いくつかの余分な ld オプションおよびライブラリー名をリンカーに自動的に渡すからです。
XL C/C++ を使用すれば、ご使用のプログラムは、 動的リンクと静的リンクの両方のためのオペレーティング・システム機能の利点を利用できるようになります。
動的にリンクされたプログラムでは、共用ライブラリーのルーチンを複数のプログラムが使用していると、 使用するディスク・スペースと仮想メモリーが少なくて済みます。 リンクが行われているときに、それらのプログラムについては、 ライブラリー・ルーチンとの間で命名上の競合を回避するためになんらかの特別な予防措置を講じる必要はありません。 いくつかのプログラムが同時に同じ共用ルーチンを使用する場合は、 静的にリンクされたプログラムよりも良好に実行する場合があります。 また、それらを使用すれば、 再リンクしないで共用ライブラリー内のルーチンをアップグレードすることができます。
このリンク形式はデフォルトなので、これを作動させるのに追加のオプションは必要ありません。
静的にリンクされたプログラムは、XL C/C++ ライブラリーがないシステムに移動してそのシステム上で実行することができます。 静的にリンクされたプログラムが、ライブラリー・ルーチンへの呼び出しを多数行ったり、 多数の小さなルーチンを呼び出す場合、 それらのプログラムは動的にリンクされたプログラムよりも良好に実行する場合があります。 ライブラリー・ルーチンとの命名の競合を回避したい場合は、 プログラム内のデータ・オブジェクトおよびルーチンの名前を選択するときに、 何らかの予防措置をとる必要があります。 また、それらのプログラムをオペレーティング・システムのあるレベルでコンパイルした後、 そのオペレーティング・システムの別のレベルで実行すると、それらは機能しない場合があります。
プログラムのリンクの詳細については、『リンケージ・エディターの呼び出し』を参照してください。
また、 ライブラリーのコンパイルとリンクに関する詳細については、の中の『ライブラリーの構成』を参照してください。