Sun Studio 12: Fortran プログラミングガイド

4.3 ライブラリ検索のパスと順序の設定

リンカーは、いくつかの場所で、指定された順序でライブラリを検索します。検索の対象となるのは、標準のパスと、コンパイラオプション -Rpath-llibrary-Ldir で指定された場所、環境変数 LD_LIBRARY_PATH で設定されている場所です。

4.3.1 標準ライブラリパスの検索順序

リンカーによって使用される標準のライブラリ検索パスはインストールパスによって決定されます。これらのパスは、静的な読み込みか動的な読み込みかによって異なります。標準インストールは、Sun Studio コンパイラソフトウェアを /opt/SUNWspro/ に配置します。

4.3.1.1 静的リンク

静的リンカーは、実行可能ファイルの構築中に、次のパス (ほかにもあります) で、指定された順序で、ライブラリを検索します。

/opt/SUNWspro/lib

Sun Studio の共有ライブラリ 

/usr/ccs/lib/

SVr4 ソフトウェアの標準の場所 

/usr/lib

UNIX ソフトウェアの標準の場所 

前述のパスは、リンカーによって使用されるデフォルトのパスです。

4.3.1.2 動的リンク

動的リンカーは、実行時に、指定された順序で、共有ライブラリを検索します。

検索パスは、実行可能ファイルに組み込まれます。

4.3.2 LD_LIBRARY_PATH 環境変数

LD_LIBRARY_PATH 環境変数を使用して、-llibrary オプションで指定したライブラリをリンカーが検索すべきディレクトリパスを指定します。

複数のディレクトリはコロンで区切って指定できます。通常、 LD_LIBRARY_PATH 変数は、コロンで区切ったディレクトリのリストを、次のようにセミコロンで区切って 2 つ持ちます。

dirlist1;dirlist2

最初に、dirlist1 のディレクトリが検索され、次に、コマンド行上で明示的に指定された -Ldir ディレクトリが検索され、最後に、dirlist2 と標準ディレクトリが検索されます。

つまり、次のように、複数の -L でコンパイラが呼び出された場合

f95 ... -Lpath1 ... -Lpathn ...

検索順序は次のようになります。

dirlist1 path1 ... pathn dirlist2 standard_paths

LD_LIBRARY_PATH 変数に、コロンで区切ったディレクトリリストが 1 つだけ含まれる場合、そのリストは dirlist2 として解釈されます。

Solaris オペレーティング環境では、64 ビットの依存関係を検索するときに、類似の環境変数 LD_LIBRARY_PATH_64 を使用して LD_LIBRARY_PATH を無効にできます。詳細は、Solaris の『リンカーとライブラリ』および ld(1) マニュアルページを参照してください。

4.3.3 ライブラリ検索のパスと順序 — 静的リンク

-llibrary コンパイラオプションを使用して、リンカーが外部参照を解決するときに検索する追加のライブラリを指定します。たとえば、オプション -lmylib は、ライブラリ libmylib.solibmylib.a を検索リストに追加します。

リンカーは標準ディレクトリパスを探して、追加の libmylib ライブラリを見つけます。-L オプション (および、LD_LIBRARY_PATH 環境変数) は、標準パス以外でライブラリを探す場所をリンカーに伝えるパスのリストを作成します。

libmylib.a がディレクトリ /home/proj/libs にある場合、オプション –L/home/proj/libs は、実行可能ファイルを構築するときに探すべき場所をリンカーに伝えます。


demo% f95 -o pgram part1.o part2.o -L/home/proj/libs -lmylib

4.3.3.1 -l library オプションのコマンド行順序

特定の参照が解決されていない場合、ライブラリは 1 度だけ検索され、さらに、検索中のその時点で未定義のシンボルだけが検索されます。コマンド行上に複数のライブラリをリストする場合、これらのライブラリは、コマンド行に指定された順序で検索されます。 -llibrary オプションは、次のように配置します。

4.3.3.2 -L dir オプションのコマンド行順序

-Ldir オプションは、dir ディレクトリパスをライブラリ検索リストに追加します。リンカーは、まず、-L オプションで指定されたディレクトリでライブラリを検索し、次に、標準ディレクトリで検索します。このオプションは、適用する –llibrary オプションより前に配置された場合だけ有効です。

4.3.4 ライブラリ検索のパスと順序 — 動的リンク

動的ライブラリで、ライブラリ検索のパスと読み込みの順序の変更は、静的リンクのときとは異なります。実際のリンクは、構築時ではなく、実行時に行われます。

4.3.4.1 構築時に動的ライブラリを指定する

実行ファイルを構築するとき、リンカーは共有ライブラリへのパスを実行可能ファイル自身に記録します。これらの検索パスは、-Rpath オプションで指定できます。対照的に、-Ldir オプションは、構築時に -llibrary オプションで指定されたライブラリを見つける場所を示しますが、このパスをバイナリ実行可能ファイルに記録しません。

実行可能ファイルが作成されたときに構築されるディレクトリパスは、dump コマンドを使用して表示できます。

例: a.out に構築されたディレクトリパスをリストします。


demo% f95 program.f -R/home/proj/libs -L/home/proj/libs -lmylib
demo% dump -Lv a.out | grep RPATH
[5]      RPATH    /home/proj/libs:/opt/SUNWspro/lib

4.3.4.2 実行時に動的ライブラリを指定する

実行時、リンカーは、実行可能ファイルに必要な動的リンクを探す場所を次から決定 します。

すでに説明したように、LD_LIBRARY_PATH の使用は予想できない副作用があるので、お勧めできません。

4.3.4.3 動的リンク中のエラーの修正

必要なライブラリを見つけることができなかったとき、動的リンカーは次のようなエラーメッセージを発行します。


ld.so: prog: fatal: libmylib.so: can't open file:

メッセージは、そこにあるべきライブラリが存在しなかったことを示しています。実行可能ファイルを構築したときには共有ライブラリのパスを指定したが、そのあとでライブラリが移動された可能性があります。たとえば、/my/libs/ 中のユーザー独自の動的ライブラリを使用して a.out を構築し、そのあとでライブラリをほかのディレクトリに移動した場合などです。

ldd を使用して、実行可能ファイルがライブラリを検索する場所を検出します。


demo% ldd a.out
libfui.so.1 =>   /opt/SUNWspro/lib/libfui.so.1
    libfai.so.1 =>   /opt/SUNWspro/lib/libfai.so.1
    libfai2.so.1 =>  /opt/SUNWspro/lib/libfai2.so.1
    libfsumai.so.1 =>    /opt/SUNWspro/lib/libfsumai.so.1
    libfprodai.so.1 =>   /opt/SUNWspro/lib/libfprodai.so.1
    libfminlai.so.1 =>   /opt/SUNWspro/lib/libfminlai.so.1
    libfmaxlai.so.1 =>   /opt/SUNWspro/lib/libfmaxlai.so.1
    libfminvai.so.1 =>   /opt/SUNWspro/lib/libfminvai.so.1
    libfmaxvai.so.1 =>   /opt/SUNWspro/lib/libfmaxvai.so.1
    libfsu.so.1 =>   /opt/SUNWspro/lib/libfsu.so.1
    libsunmath.so.1 =>   /opt/SUNWspro/lib/libsunmath.so.1
    libm.so.1 =>     /usr/lib/libm.so.1
    libc.so.1 =>     /usr/lib/libc.so.1
    libdl.so.1 =>    /usr/lib/libdl.so.1
    /usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1

可能であれば、適切なディレクトリにライブラリを移動またはコピーするか、リンカーが検索するディレクトリ中にそのディレクトリへのソフトリンクを作成します (ln -s を使用します)。または、LD_LIBRARY_PATH が正しく設定されていない可能性があります。LD_LIBRARY_PATH が実行時に必要なライブラリへのパスを含んでいるかどうかを検査します。