デフォルト時には、XL Fortran プログラムのリンクで特別に行うべきことは何もありません。リンカーが自動的に実行されて、実行可能出力ファイルを作成します。
xlf95 file1.f file2.o file3.f
リンクが終了したら、XL Fortran プログラムの実行の指示に従ってプログラムを実行してください。
後でリンクできるオブジェクト・ファイルを作成するには、-c オプションを使用します。
xlf95 -c file1.f # Produce one object file xlf95 -c file2.f file3.f # Or multiple object files xlf95 file1.o file2.o file3.o # Link with appropriate libraries
コンパイラー呼び出しコマンドでリンカーを実行するのが最善な場合もあります。このコマンドは、余分な ld オプションおよびライブラリー名をリンカーに自動的に渡すからです。
ld コマンドを使用して SMP プログラムにリンクするには、以下の指針に従ってください。
AIX バージョン 4.3 以降の場合、デフォルトの POSIX pthreads API は、1003.1-1996 標準です。mytest というプログラムがあって、 AIX バージョン 4.3 上の 1003.1-1996 標準 POSIX pthreads API の関数へアクセスしたい場合には、以下のコマンドと類似のコマンドを使用して、libpthreads.a ライブラリーとリンクすることができます。
ld -bh:4 -bpT:0x10000000 -bpD:0x20000000 /lib/crt0_r.o mytest.o -lxlf90_r -lxlf -lxlsmp -lm_r -lm -lc_r -lc -lpthreads -o mytest
1003.1-1996 標準と Draft 7 とは、完全に互換性があるわけではありません。 Draft 7 インターフェースを必要とするプログラムがある場合には、 libpthreads_compat.a および libxlfpthrds_compat.a ライブラリー (互換性サポートを提供)、それから libpthreads.a ライブラリーと、プログラムをリンクします。たとえば、Draft 7 インターフェースを使用するために書かれた mytest というプログラムがある場合には、 AIX バージョン 4.3 で、以下のコマンドと類似のコマンドを使用することができます。
ld -bh:4 -bpT:0x10000000 -bpD:0x20000000 /lib/crt0_r.o mytest.o -lxlfpthrds_compat -lxlf90_r -lxlf -lxlsmp -lm_r -lm -lc_r -lc -lpthreads_compat -lpthreads -o mytest
これらのデフォルト・ライブラリーおよびリンカー・オプションは、構成ファイル /etc/xlf.cfg にリストされます。 -# オプションを使用したサンプル・コンパイルを行うことにより、コンパイルがリンカーをどのように実行するかを正確に知ることができます。
リンカー・オプションの説明は、「AIX コマンド・リファレンス 」を参照してください。
ld コマンドを使用して 64 ビットの SMP プログラムにリンクするには、以下の指針に従ってください。
たとえば、オブジェクト・ファイル smpfile1.o と smpfile2.o をリンクするために、以下を指定することができます。
ld -bh:4 -bpT:0x10000000 -bpD:0x20000000 -b64 /lib/crt0_64.o -lxlf90 -lxlsmp -lm -lc smpfile1.o smpfile2.o
これらのデフォルト・ライブラリーおよびリンカー・オプションは、構成ファイル /etc/xlf.cfg にリストされます。 -# オプションを使用したサンプル・コンパイルを行うことにより、コンパイルがリンカーをどのように実行するかを正確に知ることができます。
リンカー・オプションの説明は、「AIX コマンド・リファレンス 」を参照してください。
ld コマンドを使用して、 32 ビット環境で SMP 以外のオブジェクト・ファイルにリンクするには、以下の指針に従ってください。
たとえば、オブジェクト・ファイル file1.o と file2.o をリンクするために以下を指定することができます。
ld -bh:4 -bpT:0x10000000 -bpD:0x20000000 /lib/crt0.o -lxlf90 -lm -lc file1.o file2.o
これらのデフォルト・ライブラリーおよびリンカー・オプションは、構成ファイル /etc/xlf.cfg にリストされます。 -# オプションを使用したサンプル・コンパイルを行うことにより、コンパイルがリンカーをどのように実行するかを正確に知ることができます。
リンカー・オプションの説明は、「AIX コマンド・リファレンス 」を参照してください。
ld コマンドを使用して、 64 ビット環境で SMP 以外のオブジェクト・ファイルにリンクするには、以下の指針に従ってください。
たとえば、オブジェクト・ファイル file1.o と file2.o をリンクするために以下を指定することができます。
ld -bh:4 -bpT:0x10000000 -bpD:0x20000000 -b64 /lib/crt0_64.o -lxlf90 -lm -lc file1.o file2.o
これらのデフォルト・ライブラリーおよびリンカー・オプションは、構成ファイル /etc/xlf.cfg にリストされます。 -# オプションを使用したサンプル・コンパイルを行うことにより、コンパイルがリンカーをどのように実行するかを正確に知ることができます。
リンカー・オプションの説明は、「AIX コマンド・リファレンス 」を参照してください。
XL Fortran デフォルトの一部ではない ld オプションでリンクしなければならない場合は、それらのオプションをコンパイラー・コマンド行に入れることができます。
xlf95 -bhalt:2 -K -r file.f # xlf95 passes all these options to ld
コンパイラーは、 -q オプション以外の認識されないオプションを ld コマンドに渡します。
-qextchk コンパイラー・オプションを指定すると、リンカーは、マッチしないプロシージャー・インターフェースまたは共通ブロック定義が含まれているオブジェクト・ファイルのリンクを拒絶することがあります。ユーザーはリンク時にこれらのエラーを見つけることができるため、間違った結果をデバッグすることはありません。
C の名前の大文字、または -qextname オプションによって後続の下線を追加したことが原因でいくつかの名前が解決しない場合、その未解決の名前とリンクの問題とを切り離すことができるならば、 -brename リンカー・オプションを使用して、それらの名前だけを変更することができます。
xlf95 -brename:Old_Link_Name,new_link_name fort_prog.o c_prog.o
XL Fortran の初期バージョンでコンパイルされた .o またはその他のオブジェクト・ファイルを持っている場合は、以下の注に従って、それらを XL Fortran バージョン 8 でコンパイルされたオブジェクト・ファイルとリンクすることができます。 XL Fortran のメイン・ライブラリーは libxlf90.a と libxlf90_r.a ですが、 libxlf.a 内の古いエントリー・ポイントを呼び出すことも依然として可能です。この呼び出しはメイン・ライブラリー内の新しいエントリー・ポイントに渡されて、その結果作成されたプログラムは、すべてを再コンパイルする場合よりも遅くなります。
注:
リンカーは実行可能ファイルを入力として受け入れるため、既存の実行可能ファイルを更新済みのオブジェクト・ファイルとリンクすることができます。ただし、-qipa オプションを使用してすでにリンクされている実行可能ファイルを再リンクすることはできません。
いくつかのソース・ファイルから構成されているプログラムを持っていて、部分的な変更をいくつかのソース・ファイルに対して行うだけの場合は、必ずしも個々のファイルを再コンパイルする必要はありません。その代わりに、変更されたファイルのコンパイル時に、実行可能ファイルを最後の入力ファイルとして組み込むことができます。
xlf95 -omansion front_door.f entry_hall.f parlor.f sitting_room.f \ master_bath.f kitchen.f dining_room.f pantry.f utility_room.f vi kitchen.f # Fix problem in OVEN subroutine xlf95 -o newmansion kitchen.f mansion
2 回目にコンパイルしてリンクするファイルの数を制限すれば、コンパイル時間、ディスクのアクティビティー、メモリー使用量が減少します。
XL Fortran を使用すれば、ご使用のプログラムは、動的リンクでも静的リンクでもオペレーティング・システム機能の利点を利用できるようになります。
動的にリンクされたプログラムは、共用ライブラリーのルーチンを複数のプログラムが使用していても、ディスク・スペースも仮想メモリーもほとんどとりません。ライブラリー・ルーチンとの命名の競合を回避するための、リンク中に行われなければならない特別な予防措置は必要とされません。いくつかのプログラムが同時に同じ共用ルーチンを使用する場合は、静的にリンクされたプログラムよりも良好に動作する場合があります。また、動的リンクを使用すれば、再リンクしないで共用ライブラリー内のルーチンをアップグレードすることができます。
このリンク形式はデフォルトなので、これをオンにするのに追加のオプションは必要ありません。
静的にリンクされたプログラムは、 XL Fortran ライブラリーがないシステムに移動してそのシステム上で実行することができます。静的にリンクされたプログラムが、ライブラリー・ルーチンへの呼び出しを多数行ったり、多数の小さなルーチンを呼び出す場合、それらのプログラムは動的にリンクされたプログラムよりも良好に動作する場合があります。ライブラリー・ルーチンとの命名の競合を回避したい場合は、プログラム内のデータ・オブジェクトおよびルーチンの名前を選択するときに、何らかの予防措置をとる必要があります (リンク中の命名競合の回避で説明しています)。また、それらのプログラムをあるシステム上でコンパイルした後、別のレベルのオペレーティング・システムを使用したシステム上で実行すると、機能しない場合があります。
コンパイラー・コマンド行で -b リンカー・オプションを使用して、静的にリンクされたオブジェクト・ファイルを作成することができます。
xlf95 -bnso -bI:/usr/lib/syscalls.exp file1.f file2.f
xlf_r、xlf_r7、xlf90_r、xlf90_r7、xlf95_r、または xlf95_r7 コマンドと静的にリンクしているときは、 -bI:/usr/lib/threads.exp も指定する必要があります。
非同期 I/O を使用している場合は、 -bI:/usr/lib/aio.exp も指定する必要があります。
-bnso オプションは、プログラムが参照するライブラリー・プロシージャーをプログラムのオブジェクト・ファイルに置きます。サフィックス .exp が付いているファイルは、システムからプログラムにインポートする必要があるシステム・ルーチンの名前です。
ディスク・スペースが少なくて済む別の方法は、XL Fortran ライブラリーを静的にリンクし、その他のシステム・ライブラリーの参照を動的リンクのまま残すことです。次の例では、XL Fortran ライブラリーだけを静的にリンクしています。
# Build a temporary object from the Fortran library: ld -r -o libtmp.o -bnso -lxlf90 # Build the application with this object on the command line: xlf95 -o appl appl1.o appl2.o libtmp.o
実行時サブプログラムと同じ名前を持つ外部サブルーチン、外部関数、共通ブロックを定義すると、その名前の定義がその場所で使用されたり、リンク・エディット・エラーが発生する場合があります。
以下の一般的な解決方法を試行して、このような種類の名前の矛盾を回避するための参考にしてください。
-qextname オプションを使用しない場合は、 XL Fortran およびシステム・ライブラリー内の外部シンボルの名前との競合を回避するために、特別な予防措置をとる必要があります。
XLF が提供する関数名 | 使用できない共通ブロック名またはサブプログラム名 |
---|---|
mclock | times |
rand | irand |
プログラムに実際のルーチンを定義せずに、サブルーチン名または関数名を使用することがないように注意してください。その名前がいずれかのライブラリーの名前と競合すると、プログラムはルーチンの間違ったバージョンを使用して、コンパイル時エラーまたはリンク時エラーを作成しない場合があります。
複数のライブラリー・ファイルまたはオブジェクト・ファイルにルーチンの別のバージョンがある場合は、使用したい特定のバージョンを使用するように注意してください。最初にコマンド行または構成ファイルに、正しいバージョンを持つファイルを指定してください。ファイルがライブラリーの場合は、最初にコマンド行に適切な -l オプションを指定してください。この手法は、同じ共用ライブラリー内のルーチン、または、ある共用ライブラリーから別の共用ライブラリーに明示的にインポートされたルーチン間の参照には適用されません。