Fortran プログラミングガイド |
第 4 章
ライブラリ
この章では、副プログラムのライブラリを使用する方法と作成する方法を説明します。静的ライブラリと動的ライブラリの両方を説明します。
ライブラリについて
ソフトウェアライブラリとは、通常、すでにコンパイルされ、1 つのバイナリライブラリファイルにまとめられた副プログラムの集合のことです。この集合の個々のメンバーは、ライブラリの要素またはモジュールと呼ばれています。リンカーはライブラリファイルを検索し、ユーザーのプログラムによって参照されるオブジェクトモジュールを読み込み、実行可能バイナリプログラムを構築します。詳細は、
ld
(1) のマニュアルページと Solaris の『リンカーとライブラリ』を参照してください。基本的にソフトウェアライブラリには、次の 2 種類があります。
- 静的ライブラリ - 実行前にモジュールが実行可能ファイルに結合されるライブラリ。静的ライブラリには、一般的に
lib
name.a
という名前が付けられます。.a
接尾辞はアーカイブを指します。- 動的ライブラリ - 実行時にモジュールが実行可能ファイルに結合されるライブラリ。動的ライブラリには、一般的に
lib
name.so
という名前が付けられます。.so
接尾辞は共有オブジェクトを指します。静的 (
.a
) バージョンと動的 (.so
) バージョンの両方をもつ一般的なシステムライブラリを次に示します。
- Fortran 77 ライブラリ:
libF77、libM77
- Fortran 95 ライブラリ:
libfsu、libfui、libfai、libfai2、libfsunai、libfprodai、libfminlai、libfmaxlai、libminvai、libmaxvai、libf77compat
- VMS Fortran ライブラリ:
libV77
- C ライブラリ:
libc
プログラムでライブラリファイルを使用すると、一般的に使用されるサブルーチンをより簡単に共有できるようになります。プログラムのリンク時にライブラリに名前を指定するだけで、プログラム内のリファレンスを解釈処理するこれらのライブラリモジュールがリンクされて、実行可能ファイルにマージされます。
リンカーのデバッグオプションの指定
ライブラリの使用と読み込みに関する要約情報を得るには、
LD_OPTIONS
環境変数を介してリンカーに追加オプションを渡します。コンパイラは、オブジェクトのバイナリファイルを生成するときに、これらのオプション (およびその他の必要なオプション) を使用してリンカーを呼び出します。直接リンカーを呼び出すより、コンパイラを使用することをお勧めします。多くのコンパイラオプションが特定のリンカーオプションまたはライブラリリファレンスを必要としており、これらのオプションやリファレンスなしでリンクすると予期せぬ結果を招くおそれがあるからです。
例:
LD_OPTIONS
環境変数を使用してロードマップを作成する場合
demo%setenv LD_OPTIONS '-m -Dfiles'
demo%f77 -o myprog myprog.f
リンカーのオプションには、コンパイラのコマンド行と同じものがあり、
f77
やf95
コマンド上に直接指定できます。 これらのオプションは、-B
x、-d
x、-G、-h
name、
path、および
-R-ztext
です。詳細については、f77(1)
とf95(1)
のマニュアルページまたは『Fortran ユーザーズガイド』を参照してください。リンカーのオプションと環境変数の例と説明は、Solaris の『リンカーとライブラリ』を参照してください。
ロードマップを作成する
リンカーの
-m
オプションは、ライブラリのリンク情報を表示するロードマップを生成します。実行可能バイナリプログラムの構築中にリンクされるルーチンが、そのルーチンが取り出されたライブラリと共にリストされます。
他の情報をリストする
他にもリンカーのデバッグ機能があり、リンカーの
-D
keyword オプションで利用できます。完全なリストを表示するには、-Dhelp
を使用します。例 :
-Dhelp
オプションを使用して、リンカーのデバッグ支援オプションをリストします。
たとえば、
-Dfiles
リンカーオプションは、リンクの処理中に参照されるすべてのファイルとライブラリをリストします。
他のリンカーオプションに関する詳細は、『リンカーとライブラリ』を参照してください。
整合性のあるコンパイルとリンク
コンパイルとリンクを別のステップで行う場合は、整合性のあるコンパイルとリンクのオプションを選択することが重要です。次のいずれかのオプションでプログラムの一部をコンパイルする場合は、同じオプションでリンクしてください。
-a
,-autopar
,-B
x,-fast
,-G
,-L
path,-l
name,-mt
,-xmemalign
,-nolib
,-norunpath
,-p
,-pg
,-xlibmopt
,-xlic_lib=
name,-xprofile=
p例 :
sbr.f
を-a
でコンパイルし、smain.f
を-a
なしでコンパイルし、それから別のステップでリンクします (-a
はtcov
旧スタイルのプロファイリングを呼び出します)。
demo%f77 -c -a sbr.f
demo%f77 -c smain.f
demo%f77 -a sbr.o smain.o
{リンクステップ -a
をリンカーに渡す。}さらに、いくつかのオプションでは、すべてのソースファイルをそのオプションでコンパイルする必要があります。オプションは次のとおりです。
-aligncommon
,-autopar
,-d
x,-dalign
,-dbl
,-explicitpar
,-f
,-misalign
,-native
,-parallel
,-pentium
,-xarch=
a,-xcache=
c,-xchip=
c,-xF
,-xtarget=
t,-ztext
すべてのコンパイラオプションについての詳細は、
f77(1)
とf95(1)
のマニュアルページおよび『Fortran ユーザーズガイド』を参照してください。ライブラリ検索のパスと順番の設定
リンカーは、いくつかの場所で、指定された順番でライブラリを検索します。検索の対象となるのは、標準のパス、コンパイラオプション
-R
path、-l
library、-L
dir で指定された場所、環境変数LD_LIBRARY_PATH
で設定されている場所です。標準ライブラリパスの検索順序
リンカーによって使用される標準ライブラリ検索パスはインストールパスによって決定されます。さらに、静的な読み込みと動的な読み込みとでは異なります。<インストールポイント> には、Fortran コンパイラがインストールされているパスを指定します。ソフトウェアの標準インストールでは、
/opt
を指定します。静的リンク
静的リンカーは、実行可能ファイルの構築中に、次のパス (他にもあります) で、指定された順序で、ライブラリを検索します。
/usr/ccs/lib/
SVr4 ソフトウェアの標準の場所 /usr/lib
UNIX ソフトウェアの標準の場所
上記パスは、リンカーによって使用されるデフォルトのパスです。
動的リンク
動的リンカーは、実行時に、指定された順序で、共有ライブラリを検索します。
LD_LIBRARY_PATH
環境変数
LD_LIBRARY_PATH
環境変数を使用して、-l
library オプションで指定したライブラリをリンカーが検索すべきディレクトリパスを指定します。複数のディレクトリはコロンで区切って指定できます。通常
dirlist1;dirlist2、LD_LIBRARY_PATH
変数は、コロンで区切ったディレクトリのリストを、次のようにセミコロンで区切って 2 つ持ちます。
最初に、dirlist1 のディレクトリが検索され、次に、コマンド行上で明示的に指定された
-L
dir ディレクトリが検索され、最後に、dirlist2 と標準ディレクトリが検索されます。つまり、次のように、複数の
-L
でコンパイラが呼び出された場合dirlist1 path1 ... pathn dirlist2 standard_paths
f77
... -Lpath1 ... -Lpathn ...
LD_LIBRARY_PATH
変数に、コロンで区切ったディレクトリリストが 1 つだけ含まれる場合、そのリストは dirlist2 として解釈されます。Solaris オペレーティング環境では、64 ビットの依存関係を検索するときに、類似の環境変数
LD_LIBRARY_PATH_64
を使用してLD_LIBRARY_PATH
を無効にできます。詳細については、Solaris の『リンカーとライブラリ』およびld
(1) マニュアルページを参照してください。
- 32 ビット SPARC プロセッサでは、
LD_LIBRARY_PATH_64
は無視されます。LD_LIBRARY_PATH
だけを定義している場合は、32 ビットと 64 ビットの両方のリンクに使用されます。LD_LIBRARY_PATH
とLD_LIBRARY_PATH_64
を定義している場合は、32 ビットのリンクにはLD_LIBRARY_PATH
が使用され、64 ビットのリンクにはLD_LIBRARY_PATH_64
が使用されます。
注 - 実際に運用するソフトウェアでは、可能な限りLD_LIBRARY_PATH
環境変数を使用しないでください。実行時リンカーの検索パスに影響を与える一時的なメカニズムとしては便利ですが、この環境変数を参照できる動的な実行可能ファイルはすべてその検索パスを変更します。そのため、予想できない結果になるか、パフォーマンスが低下する可能性があります。
ライブラリ検索のパスと順序 - 静的リンク
-l
library コンパイラオプションを使用して、リンカーが外部参照を解決するときに検索する追加のライブラリを指定します。たとえば、オプション-lmylib
は、ライブラリlibmylib.so
かlibmylib.a
を検索リストに追加します。リンカーは標準ディレクトリパスを探して、追加の
libmylib
ライブラリを見つけます。-L
オプション (および、LD_LIBRARY_PATH
環境変数) は、標準パス以外でライブラリを探す場所をリンカーに伝えるパスのリストを作成します。
libmylib.a
がディレクトリ/home/proj/libs
にある場合、オプション
-L/home/proj/libs
は、実行可能ファイルを構築するときに探すべき場所をリンカーに伝えます。
demo%f77 -o pgram part1.o part2.o -L/home/proj/libs -lmylib
-l
library オプションのコマンド行順序特定の参照が解決されていない場合、ライブラリは 1 度だけ検索され、さらに、検索中のその時点で未定義のシンボルだけが検索されます。コマンド行上に複数のライブラリをリストする場合、これらのライブラリは、コマンド行に指定された順序で検索されます。
-l
library オプションは、次のように配置します。
-l
library オプションは.f、.for、.F、.f95
、または.o
ファイルの後に配置します。lib
x 中の関数を呼び出し、これらの関数がlib
y 中の関数を参照する場合、-l
x は-l
y より前に配置します。
-L
dir オプションのコマンド行順序
-L
dir オプションは、dir ディレクトリパスをライブラリ検索リストに追加します。リンカーは、まず、-L
オプションで指定されたディレクトリでライブラリを検索し、次に、標準ディレクトリで検索します。このオプションは、適用する-l
library オプションより前に配置された場合だけ有効です。ライブラリ検索のパスと順序 - 動的リンク
動的ライブラリで、ライブラリ検索のパスと読み込みの順序の変更は、静的リンクのときとは異なります。実際のリンクは、構築時ではなく、実行時に行われます。
構築時に動的ライブラリを指定する
実行ファイルを構築するとき、リンカーは共有ライブラリへのパスを実行可能ファイル自身に記録します。これらの検索パスは、
-R
path オプションで指定できます。 対照的に、-L
dir オプションは、構築時に-l
library オプションで指定されたライブラリを見つける場所を示しますが、このパスをバイナリ実行可能ファイルに記録しません。実行可能ファイルが作成されたときに構築されるディレクトリパスは、
dump
コマンドを使用して表示できます。例 :
a.out
に構築されたディレクトリパスをリストします。
demo%f77 program.f -R/home/proj/libs -L/home/proj/libs -lmylibs
demo%dump -Lv a.out | grep RPATH
[5] RPATH /home/proj/libs:/opt/SUNWspro/lib実行時に動的ライブラリを指定する
実行時、リンカーは、実行可能ファイルに必要な動的リンクを探す場所を次から決定します。
すでに説明したように、
LD_LIBRARY_PATH
の使用は予想できない副作用があるので、お勧めできません。動的リンク中のエラーの修正
必要なライブラリを見つけることができなかったとき、動的リンカーは次のようなエラーメッセージを発行します。
ld.so: prog: fatal: libmylib.so: can't open file:メッセージは、そこにあるべきライブラリが存在しなかったことを示しています。実行可能ファイルを構築したときには共有ライブラリのパスを指定したが、その後でライブラリが移動された可能性があります。たとえば、/my/lib/ 中のユーザー独自の動的ライブラリを使用して
a.out
を構築し、その後でライブラリを他のディレクトリに移動した場合などです。
ldd
を使用して、実行可能ファイルがライブラリを検索する場所を検出します。
demo%ldd a.out
libsolib.so => /export/home/proj/libsolib.solibF77.so.4 => /opt/SUNWspro/lib/libF77.so.4libc.so.1 => /usr/lib/libc.so.1libdl.so.1 => /usr/lib/libdl.so.1可能であれば、適切なディレクトリにライブラリを移動またはコピーするか、リンカーが検索するディレクトリ中にそのディレクトリへのソフトリンクを作成します (
ln -s
を使用します)。または、 LD_LIBRARY_PATH
が正しく設定されていない可能性があります。LD_LIBRARY_PATH
が実行時に必要なライブラリへのパスを実行時に含んでいるか検査します。静的ライブラリを作成する
静的ライブラリファイルは、
ar
(1) ユーティリティを使用して、すでにコンパイルされたオブジェクトファイル (.o
ファイル) から構築します。リンカーは、リンクするプログラム中で参照される入口を持つ要素をライブラリから抽出します。たとえば、副プログラム、入口名、初期値設定副プログラム中で初期化される共通ブロックなどです。これらの抽出された要素 (ルーチン) は、リンカーによって生成される
a.out
実行可能ファイルに恒久的にリンクされます。静的ライブラリの長所と短所
静的ライブラリとリンクには、動的なライブラリとリンクと比較した場合、主に 3 つの問題に注意しなければなりません。
- 静的ライブラリは自己依存性 (独立性) に優れていますが、適用性に劣ります。
a.out
実行可能ファイルを静的にリンクすると、必要なライブラリルーチンは実行可能バイナリファイルの一部となります。しかし、a.out
実行可能ファイルにリンクされた静的ライブラリルーチンを更新する必要が出てきた場合、a.out
ファイル全体をリンクし、生成し直さなければ、更新されたライブラリを利用することができません。動的ライブラリを使用すれば、ライブラリはa.out
ファイルの一部とはならず、リンクは実行時に行われます。更新された動的ライブラリを利用するために必要なことは、新しいライブラリをシステムにインストールするだけです。
- 静的ライブラリの「要素」は個々のコンパイル単位
.o
ファイルです。1 つのコンパイル単位 (ソースファイル) には複数の副プログラムが含まれている場合があるので、いっしょにコンパイルすると、これらのルーチンは静的ライブラリ中の 1 つのモジュールとなります。つまり、コンパイル単位中のすべてのルーチンがいっしょに
a.out
実行可能ファイルに読み込まれるが、実際に呼び出されるのはこれら副プログラムの 1 つだけであるということを意味します。この状況は、複数のライブラリルーチンを複数のコンパイル可能ソースファイルに分散するという最適化によって改良できます。(ただし、プログラムによって実際に参照されるライブラリモジュールだけが実行可能ファイルに読み込まれます。)
- 静的ライブラリのリンクでは、リンクの順序が重要です。
リンカーは、コマンド行に現れる順番、すなわち左から右に入力ファイルを処理します。リンカーがライブラリの要素を読み込むべきかどうかは、すでに処理されたライブラリの要素によって決定されます。この順番は、要素がライブラリファイル中で現れる順番に依存するだけでなく、コンパイルコマンド行上で指定されたライブラリの順番にも依存します。
例 : Fortran プログラムが
main.f
とcrunch.f
の 2 つのファイルに記述され、crunch.f
だけがライブラリにアクセスする場合、crunch.f
またはcrunch.o
より前に Sun Performance Library のライブラリを参照するとエラーになります。
demo%f77 main.f -lmylibrary crunch.f -o myprog
(誤)demo%f77 main.f crunch.f -lmylibrary -o myprog
(正)簡単な静的ライブラリを作成する
1 つのプログラムのルーチンすべてがいくつかのソースファイルのグループに分散されており、また、これらのソースファイルすべてがサブディレクトリ
test_lib/
にあるものと仮定します。さらに、それぞれのファイルがユーザーのプログラムによって呼び出される 1 つの副プログラムと、その副プログラムからは呼び出されるがライブラリ中の他のルーチンからは呼び出されない「ヘルパー」ルーチンをもつように、ファイルを編成すると仮定します。また、複数のライブラリルーチンから呼び出されるヘルパールーチンはすべて 1 つのソースファイルにまとめられているとします。これによって、合理的に上手に編成されたソースファイルとオブジェクトファイルのセットができます。
各ソースファイルの名前は、そのファイルの中の最初のルーチンの名前から決定すると仮定します。ほとんどの場合、それはライブラリ中の主要なファイルです。
demo%cd test_lib
demo%ls
total 14 2 dropx.f 2 evalx.f 2 markx.f2 delte.f 2 etc.f 2 linkz.f 2 point.f低レベルの「ヘルパー」ルーチンはすべてファイル
etc.f
にまとめられます。他のファイルには、1 つまたは複数の副プログラムが入ります。まず、
-c
オプションを使用して、各ライブラリソースファイルをコンパイルし、対応する再配置可能な.o
ファイルを生成します。
次に、
ar
を使用して、静的ライブラリtestlib.a
を作成します。
demo%ar cr testlib.a *.o
このライブラリを使用するためには、コンパイルコマンド上にライブラリファイルを指定するか、
-l
と-L
コンパイルオプションを使用します。次の例では.a
ファイルを直接使用します。
demo%cat trylib.f
C testlib ルーチン群をテストするためのプログラムx=21.998call evalx(x)call point(x)print*, 'value ',xenddemo%f77 -o trylib trylib.f test_lib/testlib.a
trylib.f:MAIN:demo%主プログラムがライブラリ中の 2 つのルーチンだけを呼び出しているところに注目してください。ライブラリ中の呼び出されないルーチンが実行可能ファイルに読み込まれていないことを確認するには、
nm
によって表示される実行可能ファイル中の名前のリストで調べます。
上記の例では、
grep
は名前のリストから、実際に呼び出されたライブラリルーチンの項目だけを見つけます。ライブラリを参照するもう 1 つの方法は、
-l
library と-L
path オプションを使用する方法です。ここでは、lib
name.a
の規則に従うため、ライブラリの名前を変更しなければなりません。
demo%mv test_lib/testlib.a test_lib/libtestlib.a
demo%f77 -o trylib trylib.f -Ltest_lib -ltestlib
trylib.f:MAIN:
-l
library と-L
path オプションは、他のユーザーが参照できるように、/usr/local/lib
のようなシステム上の一般的にアクセス可能なディレクトリにインストールされたライブラリに使用できます。たとえば、libtestlib.a
を/usr/local/lib
に置いた場合、次のコマンドを使用してコンパイルするよう、他のユーザーに知らせてください。
demo%f77 -o myprog myprog.f -L/usr/local/lib -ltestlib
静的ライブラリ中の置換
2、3 の要素だけをコンパイルし直す場合、ライブラリ全体をコンパイルし直す必要はありません。
ar
の-r
オプションを使用すると、静的ライブラリ中の個々の要素を置換できます。例 : 静的ライブラリ中の 1 つのルーチンをコンパイルし直し、置換します。
demo%f77
-c point.fdemo% ar r testlib.a point.odemo%静的ライブラリ中のルーチンを整列する
ar
を使用して構築しているときに静的ライブラリ中の要素を整列するには、コマンドlorder
(1) とtsort
(1) を使用します。
demo%ar cr mylib.a `lorder exg.o fofx.o diffz.o | tsort`
動的ライブラリを作成する
動的ライブラリファイルは、リンカー
ld
によって、実行開始後に実行可能ファイルにリンクできるコンパイル済みオブジェクトモジュールから構築されます。動的ライブラリのもう 1 つの特長は、各プログラムのメモリーにモジュールを複製することなく、システムで実行中の他のプログラムからモジュールを使用できることです。この理由のため、動的ライブラリは共有ライブラリとも呼ばれます。
- オブジェクトモジュールは、コンパイルとリンクの処理中に、リンカーによって実行可能ファイルにリンクされるのではありません。リンクは実行時まで延期されます。
- 共有ライブラリのモジュールは、実行プログラムがそのモジュールを初めて参照したときに、システムメモリーにリンクされます。以降の実行プログラムがそのモジュールを参照した場合、その参照は最初のコピーにマップされます。
- 動的ライブラリを使用すると、プログラムの管理が簡単になります。更新された動的ライブラリをシステムにインストールすると、すぐに、そのライブラリを使用するすべてのアプリケーションに影響を与えます。実行可能ファイルにリンクし直す必要はありません。
動的ライブラリの長所と短所
動的ライブラリは、いくつかの長所と短所を考慮しなければなりません。
- より小さな
a.out
ファイル実行時までライブラリルーチンのリンクを延期するということは、実行可能ファイルのサイズが、ライブラリの静的バージョンを呼び出す同等な実行可能ファイルより小さいということを意味します。つまり、実行可能ファイルは、ライブラリルーチンのバイナリを含みません。
- プロセスメモリーの利用率が減少する可能性
ライブラリを使用するいくつかのプロセスが同時にアクティブになったとき、メモリーの 1 つのコピーだけがメモリーに常駐し、そのコピーがすべてのプロセスによって共有されます。
- オーバーヘッドが増加する可能性
実行時、ライブラリルーチンを読み込み、リンク編集するための余分なプロセッサ時間が必要になります。また、ライブラリの位置独立コーディングのため、静的ライブラリにおける再配置可能なコーディングよりも実行速度が遅くなる可能性があります。
- システム全体のパフォーマンスが向上する可能性
ライブラリの共有によるメモリー利用率の減少が、システム全体のパフォーマンスにとってはよい結果となるはずです (メモリースワップの入出力アクセス時間が減少します)。
プログラムのパフォーマンス状況は、各プログラムによって大きく異なります。動的ライブラリと静的ライブラリの間でパフォーマンスの向上 (または低下) を予想することは必ずしもできません。しかし、必要なライブラリの両方の形式が利用できる場合、それぞれのライブラリを使用してユーザーのプログラムのパフォーマンスを評価する価値はあります。
位置独立コードと
-pic
位置独立コード (PIC) は、リンクエディタによる再配置を必要とせず、プログラムの任意のアドレスにリンクできます。このようなコードは、本質的に同時プロセス間で共有できます。したがって、動的共有ライブラリを構築する場合、コンパイラオプション
-pic
か-PIC
を使用して、位置に依存しないように構成要素ルーチンをコンパイルしなければなりません。位置独立コードの中では、大域的なデータへの個々の参照は、大域的なオフセットテーブルへのポインタを通じての参照としてコンパイルされます。関数呼び出しはそれぞれ、手続きリンケージテーブルを通して、相対アドレッシングモードでコンパイルされます。この大域的なオフセットテーブルのサイズは、SPARC プロセッサでは 8K バイトに制限されています。
-PIC
コンパイラオプションは-pic
と似ていますが、さらに、大域的なオフセットテーブルが 32 ビットのアドレス空間に渡ることを許可します。
f77
とf95
ではさらに柔軟なコンパイラフラグがあり、-xcode=
v と指定すればバイナリオブジェクトのコードアドレス空間を指定できます。このコンパイラフラグを使用して、32 ビット、44 ビット、または 64 ビットの絶対アドレス、さらに小型モデルと大型モデルの位置に依存しないコードを生成できます。
-xcode=pic13
は-pic
に同等で、-xcode=pic32
は-PIC
に同等です。詳細についてはf77(1)
とf95(1)
のマニュアルページか『Fortran ユーザーズガイド』を参照してください。リンクオプション
コンパイル時、ライブラリのリンクが動的であるか静的であるかを指定できます。このようなオプションは実際にはリンカーオプションですが、コンパイラによって認識されリンカーに渡されます。
-Bdynamic
|-Bstatic
-Bdynamic
は、可能であれば必ず共有動的リンクの優先を設定します。-Bstatic
は、リンクを静的ライブラリだけに制限します。静的バージョンと動的バージョンの両方とも利用できるとき、このオプションを使用して、コマンド行上から設定を切り替えます。
f77 prog.f -Bdynamic -lwells -Bstatic -lsurface
-dy
|-dn
実行可能ファイル全体に対して動的リンクを許可または禁止します (このオプションは、コマンド行上では通常 1 度しか使用しません)。
-dy
は、動的共有ライブラリへのリンクを許可します。-dn
は、動的ライブラリへのリンクを禁止します。64 ビット環境でのリンク
libm.a
やlibc.a
などの静的システムライブラリによっては、Solaris の 64 ビットオペレーティング環境では使用できないものもあります。このようなライブラリは動的ライブラリ専用として提供されます。64 ビット環境で-dn
を使用すると、いくつかの静的システムライブラリが見つからないことを示すエラーが出力されます。また、コマンド行を-Bstatic
で終了しても同じ結果になります。特定のライブラリの静的バージョンとリンクするには、次のようなコマンド行を使用します。
f77 -o prog prog.f -Bstatic -labc -lxyz -Bdynamic
この場合、ユーザーの
libabc.a
とlibxyz.a
ファイルがリンクされて (libabc.so
やlibxyz.so
ではない)、最後の-Bdynamic
によってシステムライブラリを含めて残りのライブラリが動的にリンクされます。さらに複雑な状況では、適切な
-Bstatic
や-Bdynamic
を必要に応じて使用して、リンク手順で各システムライブラリとユーザーライブラリを明示的に参照する必要があります。まず、LD_OPTIONS
に '-Dfiles
' を設定して、必要なライブラリをすべてリストします。次に、-nolib
(システムライブラリの自動リンクを抑制する) を指定してリンク手順を実行し、必要なライブラリを明示的に参照します。次に例を示します。
f77 -xarch=v9 -o cdf -nolib cdf.o
-Bstatic -lF77 -lM77 -lsunmath -Bdynamic -lm -lc命名規則
リンクローダーとコンパイラによって想定された動的ライブラリの命名規則に従うために、ユーザーが作成した動的ライブラリの名前には接頭辞
lib
と接頭辞.so
を付けます。たとえば、libmyfavs.so
は、コンパイラオプション-lmyfavs
によって参照できます。また、リンカーは任意のバージョン番号接頭辞も受け付けます。たとえば、
libmyfavs.so.1
はこのライブラリのバージョン 1 です。コンパイラの
-h
name オプションは、構築される動的ライブラリの名前として name を記録します。簡単な動的ライブラリ
動的ライブラリを構築するには、
-pic
か-PIC
オプションとリンカーオプション-G
、-ztext
、-h
name を使用して、ソースファイルをコンパイルしなければなりません。これらのリンカーオプションは、コンパイラのコマンド行で利用できます。静的ライブラリの例と同じファイルを使用して、動的ライブラリを作成できます。
例 :
-pic
と他のリンカーオプションを使用してコンパイルします。
-G
は、動的ライブラリを構築することをリンカーに伝えます。
-ztext
は、位置独立コード以外のもの (たとえば、再配置可能なテキストなど) があった場合に警告を発します。例 : リンク - 動的ライブラリを使用して実行可能ファイル
a.out
を作成します。
例では、
-R
オプションを使用して、動的ライブラリへのパス (現在のディレクトリ) を実行可能ファイルにリンクしていることに注目してください。
file
コマンドは、実行可能ファイルが動的にリンクされていることを表示します。
ldd
コマンドは、実行可能ファイルtrylib
がいくつかの共有ライブラリを使用していることを表示します。この中には、前出のlibtestlib.so.1
が入っています。また、f77
のデフォルトとして、libf77
、libdl
、libc
も入っています。Sun Fortran コンパイラが提供するライブラリ
次の表に、コンパイラと共にインストールされるライブラリを示します。
詳細については、
math_libraries
README ファイルを参照してください。VMS ライブラリ
libV77
ライブラリは VMS ライブラリです。VMS ライブラリには、idate
とtime
の 2 つの特別な VMS ルーチンが含まれています。これらのルーチンを 1 つでも使用するときは、
-lV77
オプションを指定します。
idate
とtime
には、VMS バージョンと、UNIX 環境で利用できる従来のバージョンとがあります。-lV77
オプションを使用すると、idate
とtime
ルーチンの VMS 互換バージョンの方が取り出されます。これらのルーチンに関する詳細は、『Fortran ライブラリ・リファレンス』と『FORTRAN 77 言語リファレンス』を参照してください。
POSIX
ライブラリFortran 77 と共に提供される
POSIX
の結合には 2 つのバージョンがあります。検査には時間がかかり、
libFposix_c
は何倍か遅くなります。どちらの
POSIX
ライブラリも静的および動的の形式があります。提供される
POSIX
結合は IEEE 標準規格 1003.9-1992 用です。IEEE 1003.9 は、FORTRAN (X3.8-1978) に 1003.1-1990 を結合したものです。
詳細は、次の POSIX.1 のドキュメントを参照してください。
POSIX
がどのようなものであるかを正確に知りたい方には、1003.9 と POSIX.1 のドキュメントが両方とも必要になります。
f95
の POSIX ライブラリは、libposix 9
です。出荷可能なライブラリ
ユーザーの実行可能ファイルが、
runtime.libraries
README
ファイルにリストされている Sun 動的ライブラリを使用している場合、ユーザーのライセンスには、そのライブラリをユーザーの顧客に再配布する権利が含まれます。この
README
ファイルはREADMEs
ディレクトリにあります。<インストールポイント>
/SUNWspro/READMEs/ja
ヘッダーファイル、ソースコード、オブジェクトモジュール、オブジェクトモジュールの静的ライブラリは、いかなる形式でも再配布または公開しないでください。
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |