XL C/C++ でのプログラムの編集、コンパイル、およびリンク

コンパイラー・フェーズ
C および C++ ソース・ファイルの編集
XL C/C++ によるコンパイル
並列化 XL C/C++ アプリケーションのコンパイル
XL C/C++ 入力ファイル
XL C/C++ 出力ファイル
コンパイラー・オプションの指定
XL C/C++ プログラムのリンク
別個のステップでのコンパイルおよびリンク
動的および静的リンク

基本的な C および C++ プログラム開発は、編集、コンパイル、およびリンク (デフォルトで、コンパイルと組み合わせられた単一ステップ)、 および実行の反復されるサイクルから成り立ちます。

前提条件の情報:
  1. コンパイラーを使用できるようになるためには、まず、 すべての Linux 設定値 (たとえば特定の環境変数およびストレージの制限) が正しく構成されていることを確かめる必要があります。 詳細については、環境変数と XL C/C++を参照してください。
  2. C および C++ プログラムの作成に関してさらに学習するには、 「XL C/C++ Advanced Edition V8.0 for Linux 言語解説書」を参照してください。

コンパイラー・フェーズ

典型的なコンパイラー呼び出しコマンドは、以下に挙げるプログラムのうちいくつか、 またはすべてを順序どおりに実行します。 リンク時の最適化については、フェーズの中のあるものは、 コンパイル中に複数回実行されます。 各々のプログラムが実行されるときに、結果が、 順序に並んでいるものの中の次のステップに送られます。

  1. プリプロセッサー
  2. 以下のフェーズから成り立つコンパイラー。
    1. フロントエンド構文解析およびセマンティック分析
    2. ループ変換
    3. プロシージャー間分析
    4. 最適化
    5. レジスター割り振り
    6. 最終アセンブリー
  3. アセンブラー (プリプロセスされた後の .s ファイルおよび .S ファイルについて)
  4. リンカー ld

コンパイラーがこれらのフェーズをステップスルーするのを見るためには、 ユーザーが自身のアプリケーションをコンパイルするときに、-qphsinfo および -v コンパイラー・オプションを指定します。

C および C++ ソース・ファイルの編集

C および C++ ソース・プログラムを作成するには、vi または emacs といった、 使用可能な任意のテキスト・エディターを使用することができます。 構成ファイルが追加の非標準ファイル名サフィックスを または -qsourcetype コンパイラー・オプションが追加の非標準ファイル名サフィックスを定義するのでない限り、 ソース・プログラムは認識されたファイル名サフィックスを使用する必要があります。 XL C/C++ によって認識されたファイル名サフィックスのリストについては、XL C/C++ 入力ファイルを参照してください。

C または C++ ソース・プログラムが有効なプログラムであるためには、 そのソース・プログラムは、「XL C/C++ Advanced Edition V8.0 for Linux 言語解説書」に指定されている言語定義に準拠している必要があります。

XL C/C++ によるコンパイル

ソース・プログラムをコンパイルするには、 次に示す構文をもつコンパイラー呼び出しコマンドのうちの 1 つを使用します。

構文図を読む構文図をスキップする>>-compiler_invocation------------------------------------------>
 
   .-----------------------------------------.
   | .---------------------.                 |
   V V                     |                 |
>------+-----------------+-+----input_file---+-----------------><
       '-cmd_line_option-'
 

コンパイラー呼び出しコマンドは、C または C++ ソース・ファイルをコンパイルし、 任意の .s ファイルおよび .S ファイルをアセンブルし、 オブジェクト・ファイルとライブラリーを 1 つの実行可能プログラムにリンクするのに必要なすべての手順を実行します。

新規の C または C++ アプリケーションの作業については、xlC または xlc++、 またはスレッド・セーフでそれに対応するものを使用してコンパイルすることを考慮する必要があります。

xlCxlc++ は両方ともプログラム・ソースを C かまたは C++ としてコンパイルしまが、C++ ファイルを xlc でコンパイルすると、C コンパイラーによってリンカーが呼び出されたときに C++ コードに必要なライブラリーが指定されていないために、 リンクまたはランタイムのエラーが生じる結果になることがあります。他の基本コンパイラー呼び出しコマンドは、 主として、C または C++ 言語のさまざまなレベルおよび拡張機能に対する明示的なコンパイル・サポートを提供するために存在します。

基本コンパイラー呼び出しコマンドに加えて、XL C/C++ は、また、 多くの基本コンパイラー呼び出しの、専門化されたバリアントを提供します。 基本コンパイラー呼び出しに対するバリエーションには、 その呼び出しコマンドの名前にサフィックスを付加することによって、名前が付けられます。 呼び出しのバリアントのサフィックスの意味は以下のとおりです。

_r
-qsmp あるいは IBM SMP が含まれているソース・コードを使用してコンパイルされたアプリケーションも含めたマルチスレッド・アプリケーション用の POSIX Pthread API をサポートするスレッド・セーフ呼び出しバリアント

表 4. XL C/C++ コンパイラー呼び出しコマンド
基本呼び出し 基本呼び出しのバリアント 説明
xlC
xlc++
xlC_r
xlc++_r
ソース・ファイルを C++ 言語ソース・コードとしてコンパイルするために、 コンパイラーを呼び出します。
xlc xlc_r ソース・ファイルを C ソース・コードとしてコンパイルするように、コンパイラーを呼び出します。
c99 c99_r ISO C99 規格 (ISO/IEC 14882:1999) へ厳密に準拠してソース・ファイルがコンパイルされるようにコンパイラーを呼び出します。
注:
ISO C99 規格は、ランタイム・ライブラリーの機能も指定します。 これらの機能は、 現在ご使用のシステムにインストールされているランタイム・ライブラリーではサポートできません。
c89 c89_r ISO C89 規格 (ISO/IEC 9899:1990) へ厳密に準拠してソース・ファイルがコンパイルされるようにコンパイラーを呼び出します。
cc cc_r C89 または C99 への準拠を必要としないレガシー C コードを使用するように、 コンパイラーを呼び出します。
gxlc   GNU C コマンド行オプションを XL C/C++ オプションへ変換した後、コンパイラーを呼び出します。
注:
すべての GNU C オプションが完全に XL C/C++ に対応するものをもっているわけではありません。
gxlC
gxlc++
  GNU C++ コマンド行オプションを XL C/C++ オプションへ変換した後、 コンパイラーを呼び出します。
注:
すべての GNU C++ オプションが完全に XL C/C++ に対応するものをもっているわけではありません。

並列化 XL C/C++ アプリケーションのコンパイル

XL C/C++ は、 マルチプロセッサー環境で使用される並列化アプリケーションをコンパイルするのに使用できるスレッド・セーフのコンパイル呼び出しを提供します。

これらの呼び出しは、 それらがコンパイルされたオブジェクトをスレッド・セーフ・コンポーネントおよびライブラリーにリンクしバインドすることを除いて、 対応する基本コンパイラー呼び出しと同様です。

注:
これらのコマンドのいずれかを単独で使用することは、 並列処理を暗黙指定することにはなりません。 コンパイラーが OpenMP ディレクティブを認識し並列処理を活動化するためには、-qsmp コンパイラー・オプションも指定する必要があります。 今度は、-qsmp オプションの方は、 これらの 6 つの呼び出しコマンドのうちの 1 つと一緒にのみ指定することができます。 -qsmp を指定すると、 ドライバーは構成ファイルのアクティブ・スタンザにある smp ライブラリー行で指定されたライブラリーにリンクします。

XL C/C++ 入力ファイル

コンパイラーへの入力ファイルには次のものがあります。

ソース・ファイル (C 言語用の .c サフィックス、 C++ 言語用の .C .cc .cp .cpp .cxx .c++ サフィックス)
コンパイラーは、これらのサフィックスの付いたファイルを、 コンパイル用の C または C++ ソース・ファイルであると見なします。

コンパイラーは、指定されたソース・ファイルをコマンド行で指定された順序でコンパイルします。 指定されたソース・ファイルが見つからない場合、 コンパイラーはエラー・メッセージを作成し、 次のファイルがあれば、そのファイルに進みます。

標準の C または C++ ファイル命名規則に準拠しない C または C++ ソース・ファイルをもっている場合には、-+ コンパイラー・オプションを使用して、コンパイラーに、 そのようなファイルを C または C++ ソース・ファイルとして扱うように指示することができます。 そのようなファイルは、-+ コンパイラー・オプションが有効である場合、.a、.o、.so、.s、または .S ファイル名サフィックスをもつものを除き、C++ ソース・ファイルとしてコンパイルされます。

インクルード・ファイルには、ソースも含まれており、 しばしば、通常 C または C++ ソース・ファイル用に使用されるものとは異なるサフィックスをもちます。

プリプロセスされるソース・ファイル (.i サフィックス)
コンパイラーは、プリプロセスされるソース・ファイル filename.i をコンパイラーへ送り、そのファイルはそこで再度 .c または .C ファイルと同様にプリプロセスされます。 プリプロセスされるファイルは、 マクロおよびプリプロセッサー・ディレクティブを検査するのに有用です。
オブジェクト・ファイル (.o サフィックス)
コンパイラーは、ソース・ファイルをコンパイルした後、ld コマンドを使用して、結果の .o ファイル、入力ファイルとして指定した任意の .o ファイル、および製品およびシステムのライブラリー・ディレクトリー内のいくつかの .o および .a ファイル をリンクします。 コンパイラーは、次に、それらのオブジェクト・ファイルから、 単一の .o オブジェクト・ファイルまたは単一の実行可能出力ファイルを作成することができます。
アセンブラー・ソース・ファイル (.s および .S サフィックス)
コンパイラーは、アセンブラー・ソース・ファイルをアセンブラー (as) へ送ります。 アセンブラーは、リンク時にオブジェクト・ファイルをリンカーへ送ります。
注:
.S ファイル名サフィックスをもつアセンブラー・ソース・ファイルがコンパイラーによって最初にプリプロセスされ、 次にアセンブラーへ送られます。
共用オブジェクトまたはライブラリー・ファイル (.so サフィックス)
これらは、実行時にマルチプロセスによってロードされ共用されることが可能なオブジェクト・ファイルです。 リンク時に共用オブジェクトが指定されると、 オブジェクトに関する情報は出力ファイルに記録されますが、 共用オブジェクトからのコードは実際に出力ファイルには組み込まれません。
構成ファイル (.cfg サフィックス)
構成ファイルの内容は、コンパイル・プロセスの多くの面 (最も一般的には、 コンパイラーのデフォルト・オプション) を決定します。 それを使用して、各種のデフォルト・コンパイラー・オプションのセットを集中させたり、1 つのシステム上に複数のレベルの XL C/C++ コンパイラーを存在し続けさせたりすることができます。

デフォルト構成ファイルは /etc/opt/ibmcmp/vac/8.0/vac.cfg および /etc/opt/ibmcmp/vac/8.0/gxlc.cfg です。

プロファイル・データ・ファイル

-qpdf1 オプションは、後続のコンパイルで使用されるランタイム・プロファイル情報を作成します。 この情報は、パターン .*pdf* に一致する名前をもった 1 つ以上の隠しファイルに保管されます。

XL C/C++ 出力ファイル

C および C++ が作成する出力ファイルは以下のとおりです。

実行可能ファイル: a.out
デフォルトで、XL C/C++ は、a.out という名前の実行可能ファイルを現行ディレクトリーに作成します。
オブジェクト・ファイル: filename.o
-c コンパイラー・オプションを指定すると、 コンパイラーは実行可能ファイルを作成する代わりに、 指定された各プログラム・ソース入力ファイルに対してオブジェクト・ファイルを 1 つ作成し、 アセンブラーは指定された各アセンブラー入力ファイルに対してオブジェクト・ファイルを 1 つ作成します。 デフォルトで、出力オブジェクト・ファイルは、 それらに対応するソース入力ファイルと同じファイル名プレフィックスを使用して、 現行ディレクトリーに保管されます。
アセンブラー・ソース・ファイル: filename.s
-S コンパイラー・オプションを指定すると、XL C/C++ コンパイラーは実行可能ファイルを作成する代わりに、 指定された各入力ソース・ファイルに対して同等のアセンブラー・ソース・ファイルを 1 つ作成します。 デフォルトで、出力アセンブラー・ソース・ファイルは、 それらに対応するソース入力ファイルと同じファイル名プレフィックスを使用して、 現行ディレクトリーに保管されます。
コンパイラー・リスト・ファイル: filename.lst
デフォルトでは、1 つ以上のリスト関連のコンパイラー・オプションを指定しない限り、 リストは作成されません。 リスト・ファイルは、 ソース・ファイルと同じファイル名プレフィックスを付けて現行ディレクトリーに入れられます。
cpp にプリプロセスされるソース・ファイル: filename.i
プリプロセスされるソース・ファイルを作成するには、 コンパイル時に、-P オプションを指定します。 ソース・ファイルはプリプロセスされますが、コンパイルはされません。 -E オプションからの出力をリダイレクトして、#line ディレクティブが含まれているプリプロセスされたファイルを生成することもできます。 プリプロセスされるソース・ファイル、filename.i は、 各ソース・ファイルごとに 1 つ作成されます。 デフォルトで、出力プリプロセッサー・ソース・ファイルは、 それらに対応するソース入力ファイルと同じファイル名プレフィックスを使用して、 現行ディレクトリーに保管されます。
依存関係ファイルの作成: filename.u
-M または -qmakedep コンパイラー・オプションが有効になっているときに、 コンパイラーは、コンパイルされた各 C または C++ ソース・ファイルごとに、.u ファイルを作成します。 ユーザーは、.u ファイルが提供する依存関係情報を使用して、Make ファイルを作成するのに役立てることができます。

各 .u ファイルには、次のような一般的形で、 入力ファイル用に 1 行、および各インクルード・ファイル用に 1 つの項目が入っています。

file_name.o :file_name.c 
file_name.o :include_file_name

インクルード・ファイルは、#include プリプロセッサー・ディレクティブ用の、コンパイラー検索順序規則に従ってリストされます。 見つからない場合は、インクルード・ファイルは .u ファイルに追加されません。 include 文のないファイルは、 入力ファイル名だけをリストする 1 行が入っている出力ファイルを作成します。

プロファイル・データ・ファイル (.*pdf*)
これらは、-qpdf1 コンパイラー・オプションが作成するプロファイル指示フィードバック・ファイルです。 これらは、以降のコンパイルで、実際の実行結果に従って最適化を調整するために使用されます。

コンパイラー・オプションの指定

コンパイラー・オプションは、コンパイラー特性の設定、 作成されるオブジェクト・コードの記述、 出される診断メッセージの制御、および一部のプリプロセッサー機能の実行など、 さまざまな機能を実行します。

コンパイラー・オプションは以下のようにユーザーが指定できます。

複数のコンパイラー・オプションを指定した場合、 オプションの競合および非互換が起きる可能性があります。 このような競合を整合性のある方法で解決するために、 コンパイラーは通常次の一般的な優先順位の順序を適用します。

  1. ソース・ファイルのディレクティブ・ステートメントは、コマンド行設定値を オーバーライド する。
  2. コマンド行コンパイラー・オプション設定値は、 構成ファイル設定値をオーバーライド する。
  3. 構成ファイル設定値は、デフォルト設定値をオーバーライド する。

一般に、コンパイラーを呼び出すときにコマンド行上で同じコンパイラー・オプションが複数回指定されると、 最後に指定されたオプションが優先されます。

注:
-I コンパイラー・オプションは特別なケースです。 コンパイラーは、コマンド行で -I を使用して 指定されたディレクトリーを検索する前に、vac.cfg ファイル内の -I で指定された任意のディレクトリーを検索します。 これらのオプションは、優先的ではなく、累積的です。

累積的動作を行う他のオプションは、-R および (小文字の L) です。

コンパイラー・オプションをリンカー、アセンブラー、およびプリプロセッサーに渡すこともできます。 コンパイラー・オプションおよびそれらの指定の仕方に関する情報の詳細については、 『コンパイラー・オプションの参照』を参照してください。

XL C/C++ プログラムのリンク

デフォルトでは、ユーザーは、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++ を使用すれば、ご使用のプログラムは、 動的リンクと静的リンクの両方のためのオペレーティング・システム機能の利点を利用できるようになります。

プログラムのリンクの詳細については、『リンケージ・エディターの呼び出し』を参照してください。

また、 ライブラリーのコンパイルとリンクに関する詳細については、の中の『ライブラリーの構成』を参照してください。