C++ ユーザーズガイド

共有ライブラリの使用

C++ コンパイラには、次の共有ライブラリが含まれています。

プログラムにリンクされた各共有オブジェクトは、生成される実行可能ファイル (a.out ファイル) に記録されます。この情報は、実行時に ld.so が使用して動的リンク編集を行います。ライブラリコードをアドレス空間に実際に組み込むのは後になるため、共有ライブラリを使用するプログラムの実行時の動作は、環境の変化 (つまり、ライブラリを別のディレクトリに移動すること) に影響を受けます。たとえば、Solaris 2.6 オペレーティング環境でプログラムが /opt/SUNWspro/SC5.0/liblibcomplex.so.5 とリンクされている場合、後で libcomplex.so.5 ライブラリを /opt2/SUNWspro/SC5.0/lib に移動すると、このバイナリコードを実行したときに次のメッセージが表示されます。


ld.so.1: a.out: libcomplex.so.5: open に失敗しました: 
ファイルもディレクトリもありません。

ただし、環境変数 LD_BINARY_PATH に新しいライブラリの ディレクトリを設定すれば、古いバイナリコードを再コンパイルせずに実行できます。

C シェルでは次のように入力します。


demo% setenv LD_LIBRARY_PATH /opt2/SUNWspro/SC5.0/lib:${LD_LIBRARY_PATH}

Bourne シェルでは次のように入力します。


demo$ LD_LIBRARY_PATH=/opt2/SUNWspro/SC5.0/lib:${LD_LIBRARY_PATH}
demo$ export LD_LIBRARY_PATH

LD_BINARY_PATH には、ディレクトリのリストが含まれています。ディレクトリは通常コロンで区切られています。C++ のプログラムを実行すると、動的ローダーがデフォルトディレクトリより前に LD_BINARY_PATH のディレクトリを検索します。

実行可能ファイルにどのライブラリが動的にリンクされるのかを知るには、ldd コマンドを使用します。

% ldd a.out

共有ライブラリを移動することはめったにないので、この手順が必要になることはほとんどありません。


注 -

共有ライブラリを dlopen で開く場合は、RTLD_GLOBAL を使用しないと例外が機能しません。


共有ライブラリの詳しい使い方については、Solaris 7 の『リンカーとライブラリ』を参照してください。