16.5. GCC での動的ライブラリーの使用
動的ライブラリーは、スタンドアロンの実行可能ファイルとして利用できます。このファイルは、リンク時およびランタイム時に必要です。このファイルは、アプリケーションの実行可能ファイルからは独立しています。
前提条件
- GCC がシステムにインストールされている
- 有効なプログラムを設定するソースまたはオブジェクトファイルのセット。 動的ライブラリー foo のみが必要です。
- foo ライブラリーは libfoo.so として利用できること
プログラムの動的ライブラリーへのリンク
動的ライブラリー foo にプログラムをリンクするには、以下のコマンドを実行します。
$ gcc ... -Llibrary_path -lfoo ...
プログラムを動的ライブラリーにリンクすると、作成されるプログラムは常にランタイム時にライブラリーを読み込む必要があります。ライブラリーの場所を特定するオプションは 2 つあります。
-
実行ファイルに保存された
rpath
の値を使用する方法 -
ランタイム時に
LD_LIBRARY_PATH
変数を使用する方法
実行ファイルに保存された rpath
の値を使用する方法
rpath
は、リンク時に実行可能ファイルの一部として保存される特殊な値です。後に実行可能ファイルからプログラムを読み込む時に、ランタイムリンカーが rpath
の値を使用してライブラリーファイルの場所を特定します。
GCC とリンクし、library_path のパスを rpath
として保存します。
$ gcc ... -Llibrary_path -lfoo -Wl,-rpath=library_path ...
library_path のパスは、libfoo.so ファイルを含むディレクトリーを参照する必要があります。
-Wl,-rpath=
オプションのコンマの後にスペースがあるので注意してください。
後でプログラムを実行するには、以下のコマンドを実行します。
$ ./program
LD_LIBRARY_PATH 環境変数を使用する方法
プログラムの実行可能ファイルに rpath
がない場合、ランタイムリンカーは LD_LIBRARY_PATH
環境変数を使用します。この変数の値は、共有ライブラリーのオブジェクトがあるパスに合わせて、プログラムごとに変更する必要があります。
rpath
セットがなく、ライブラリーが library_path パスにある状態で、プログラムを実行します。
$ export LD_LIBRARY_PATH=library_path:$LD_LIBRARY_PATH
$ ./program
rpath
の値を空白にすると柔軟性が出ますが、プログラムを実行するたびに LD_LIBRARY_PATH
変数を設定する必要があります。
ライブラリーのデフォルトディレクトリーへの配置
ランタイムのリンカー設定では、複数のディレクトリーを動的ライブラリーファイルのデフォルトの場所として指定します。このデフォルトの動作を使用するには、ライブラリーを適切なディレクトリーにコピーします。
動的リンカーの動作に関する詳細については、本書では扱いません。詳しい情報は、以下の資料を参照してください。
動的リンカーの Linux man ページ:
$ man ld.so
/etc/ld.so.conf
設定ファイルの内容:$ cat /etc/ld.so.conf
追加設定なしに動的リンカーにより認識されるライブラリーのレポート (ディレクトリーを含む):
$ ldconfig -v