動的ライブラリで、ライブラリ検索のパスと読み込みの順序の変更は、静的リンクのときとは異なります。実際のリンクは、構築時ではなく、実行時に行われます。
実行ファイルを構築するとき、リンカーは共有ライブラリへのパスを実行可能ファイル自身に記録します。これらの検索パスは、-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 |
実行時、リンカーは、実行可能ファイルに必要な動的リンクを探す場所を次から決定 します。
実行時の LD_LIBRARY_PATH の値
実行可能ファイルが構築されたときに -R で指定されたパス
すでに説明したように、LD_LIBRARY_PATH の使用は予想できない副作用があるので、お勧めできません。
必要なライブラリを見つけることができなかったとき、動的リンカーは次のようなエラーメッセージを発行します。
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 が実行時に必要なライブラリへのパスを含んでいるかどうかを検査します。