ページの先頭行へ戻る
Enterprise Postgres 15 アプリケーション開発ガイド

A.6.2 間接的に利用するライブラリのアプリケーションへの直接リンク

注意

本内容は煩雑である上、多くのアプリケーションにおいて本内容に該当する可能性は低いと考えられます。

アプリケーション作成時のテスト等において、アプリケーションが予期せず実行できない場合(下記で説明するように、libF3のロードに失敗するか、他ライブラリと競合が起こり実行時エラーとなる場合)にのみ、参考にすることをお勧めします。

Fujitsu Enterprise Postgresが同梱するライブラリを利用するアプリケーションについて、例えば、以下のように、libF1,libF2,libF3 が他のアプリケーションやライブラリと以下のような依存関係を持つ場合、アプリケーションビルド時に、libF3を直接リンクするようビルドオプションに指定してください。

直接リンクしない場合、アプリケーション実行時にLD_LIBRARY_PATH にlibF3 が格納されるパスを指定してください。

上記以外の場合、アプリケーション実行時にエラーとなる可能性があります。

以下を前提とした例で説明します。

一般的にライブラリのロードにおいて、あるlibAがlibBを必要とし、libBがlibCを必要とする場合、libBの探索にはlibAに設定されたDT_RUNPATHの値のみが利用され、libCの探索にはlibBに設定された DT_RUNPATH の値のみが利用されます。

上記の「libF3をapl1に直接リンクしない場合」の図において言えば、libF1の探索では、apl1に設定されたDT_RUNPATHの値が利用されます。libF2 の探索では、libF1 に設定されたDT_RUNPATHの値が利用されます。それぞれのDT_RUNPATHには、「Fujitsu Enterprise Postgresのインストールディレクトリ/lib」が設定されているため、libF1やlibF2を探索した際、 Fujitsu Enterprise Postgres が同梱するlibF1、libF2 を発見し、それらをロードできます。

しかし、libF3 の探索では、Fujitsu Enterprise Postgres が同梱する libF3 をロードできません。libF3の探索では、libAに設定されたDT_RUNPATHの値を利用しますが、libAにはDT_RUNPATHの値が設定されていないためです。

そのため、libF3を見つけることができずlibF3 のロードに失敗するか、または、マシン中に存在する、期待しないlibF3を発見し、それをロードしても、Fujitsu Enterprise Postgres が同梱するlibF2 との間で競合が起こり、実行時エラーとなる可能性があります。(ここでの競合とは、libF3で参照するシンボルが、libF2で定義されていないことです。)

上記の「libF3 をapl1に直接リンクする場合」の図で示したように、アプリケーションにlibF3を直接リンクすることで、アプリケーションのDT_RUNPATH を利用し、Fujitsu Enterprise Postgresが同梱するlibF3 をロードすることができます。または、LD_LIBRARY_PATH を設定することで、Fujitsu Enterprise Postgres が同梱するlibF3 をロードすることができます。