[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

6. ライブラリインターフェースのバージョン

共有ライブラリで導入された発行物で,最も難しいものは,実行時の依存性の作 成と解決です.プログラムとライブラリの依存性は,sedのような単一の 名前の用語で,よく記述されます.そのため"libtoolはsedに依存する"と告げ, それで十分目的を果たせます.

しかし,規則的にインターフェースが変更されるとき,我々はより具体的に告げ る必要があります."Gnus 5.1はEmacs 19.28以上を要求する."ここでは,名 前からなるインターフェースの記述と"バージョンナンバー"です.

種類の説明はいくつかの目的において十分でないことすらあります.Emacs 20で 変更された場合,Gnus 5.1を破壊するのに十分ではないでしょうか?

同じ問題は,共有ライブラリでも存在します.我々は,プログラムが必要として いるインターフェースを提供するライブラリのみとリンクされることを,ダイナ ミックリンカが保証できるように,プログラムが依存する共有ライブラリを記述 するために,公式なバージョン管理システムが必要です.


6.1 ライブラリインターフェースとは?

ライブラリのインターフェースは,以下の何か(またはそれ以上)でしょう.

スタティック関数は,ライブラリのユーザが直接利用不可能なので,インター フェースに数えられないことに注意してください.


6.2 libtoolのバージョン管理システム

libtoolは独自の公式のバージョン管理システムがあります.それは,あまり柔 軟ではありませんが,強力なバージョン管理システムで,確かに最も単純です.

ライブラリとは,整数で任意に表示できるインターフェースのいくつかの組を エクスポートするものだと考えて下さい.プログラムがライブラリとリンクされ るとき,これらのインターフェースのサブセットを利用するかもしれません.

プログラムが使用するインターフェースのlibtoolの記述は単純です.それは, 結果のバイナリにある最大と最小のインターフェースの番号を符号化します (first-interface, last-interface).

ダイナミックリンカは,ライブラリがfirst-interfacelast-interfaceの間のすべてのインターフェースの番号をサポー トする場合,プログラムがライブラリとリンク可能なことを保証します.

libtoolの移植性の要求が,実際に必要と言うよりは厳密なので,問題を生じる 可能性があることに注意してください.

さて,`libhello'がインターフェースの5,16,17,18,と19をサポートし, libtoolは`libhello'を`test'にリンクするとき使用されると仮定し ます.

libtoolは`test'に数字5と19を符号化し,ダイナミックリンカは,5と19の 間のすべてのインターフェースをサポートしているライブラリのみと, `test'をリンクします.そのため,ダイナミックリンカは`libhello' と`test'をリンクすることを拒否するのです!

この問題を排除するために,libtoolはライブラリは,連続したインターフェー ス番号を宣言することのみ可能としています.そのため,`libhello'は, 16 から19までのインターフェースをサポートすることを宣言するのが精一杯で す.そして,ダイナミックリンカは,`libhello'を`test'とリンクし ます.

そのため,libtoolライブラリバージョンは,3つの整数で宣言されます.

current

このライブラリで実装されている,最も新しいインターフェース番号.

revision

currentのインターフェースの実装番号.

age

このライブラリで実装されている,最新と最古のインターフェースの違い.言い 換えると,ライブラリは,current - ageから currentまでの番号の範囲で,すべてのインターフェース番号を実 装しています.

2つのライブラリが,個別のcurrentageを持つ場合,ダイナミッ クリンカは,より大きいrevision番号を選択します.


6.3 ライブラリバージョン情報の更新

libtoolのバージョン管理システムを使用したい場合,リンクモード (see section リンクモード)の時に,`-version-info'フラグを使用して,libtool にバージョン情報を指定する必要があります.

このフラグは,`current[:revision[:age]]'の形式の 引数を受け入れます.そして,`-version-info 3:12:1'を渡すと, currentを3,revisionを12,そしてageを1に設定します.

revisionageが省略された場合,デフォルトは0になります.また, agecurrentインターフェース番号以下にする必要があることに注 意してください.

ライブラリバージョン情報を更新する助けとなる規則の集合は,以下のようにな ります.

  1. バージョン情報は,それぞれのlibtoolライブラリに対し`0:0:0'で始めて ください.

  2. ソフトウェアの一般へのリリースの直前にのみ,バージョン情報を更新してくだ さい.より頻繁な更新は不要で,現在のインターフェース番号が速くなることを 保証するだけです.

  3. 前回の更新から,ライブラリソースコードが完全に変更された場合, revisionを増加してください(`c:r:a'は `c:r+1:a'となります).

  4. 前回の更新から,インターフェースが加えられた,削除された,または変更され た場合,currentを増加し,revisionを0に設定してください.

  5. 前回の一般へのリリースから,あるインターフェースが削除された場合, ageを0に設定してください.

  6. 前回の一般へのリリースから,あるインターフェースが削除された場合, ageを0に設定してください.

パッケージのリリース番号に対応するように,インターフェース番号を設定する 試みは決してしないでください.これは,ライブラリバージョ ンの目的の誤解を促進する悪習にすぎません.その代わり,`-release' フラグ(see section リリース情報の管理)を使用しますが,パッケージが他のリリース とバイナリ互換でないことを警告されます.


6.4 リリース情報の管理

プログラムをライブラリにリンクしたいユーザに明確になるように,パッケージ リリース名を共有ライブラリに符号化したいこともよくあります.この便利さは, 特にGNU/Linuxで使用されます.

 
trick$ ls /usr/lib/libbfd*
/usr/lib/libbfd.a	    /usr/lib/libbfd.so.2.7.0.2
/usr/lib/libbfd.so
trick$

`trick'として,`/usr/lib/libbfd.so'は`libbfd.so.2.7.0.2' へのシンボリックリンクで,それは`binutils-2.7.0.2'の一部として配布 されています.

ライブラリインターフェースは,リリース番号のように,滅多に同時に変更され す,ライブラリ接尾子はすべてのプラットフォームを跨り,すべて同じではない ので,残念ながらこの便利さはlibtoolのライブラリバージョンの情報の考えと 直接衝突します.

そのため,両方の見方に適応するため,`-version-info'を使用したくない ライブラリに対し,リリース情報を設定するにあたり,`-release'フラグ を使用することができます.`libbfd'の例では,libtoolが使用する次のリ リースは,`-release 2.9.0'でビルドされるべきで,それは,GNU/Linuxで, 以下のファイルを生成します.

 
trick$ ls /usr/lib/libbfd*
/usr/lib/libbfd-2.9.0.so     /usr/lib/libbfd.a
/usr/lib/libbfd.so
trick$

この場合,`/usr/lib/libbfd.so'は`libbfd-2.9.0.so'へのシンボリッ クリンクです.これは`binutils-2.9.0'を扱っているユーザにとって,バー ジョン情報のlibtoolの考えに妥協することなく,明白になります.

このオプションはライブラリ名を編集することに注意し,過去のライブラリリリー スとのバイナリ互換を壊したくない場合は使用しないでください.一般的に,パッ ケージの内部ライブラリや,大変頻繁に変更されるインターフェースを持つ物に 対してのみ`-release'を使用してください.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on June, 15 2005 using texi2html 1.70.