
私は現在クロスプラットフォームの共有ライブラリを開発しており、*nixで動作する正しい方法について少し混乱しています。私のバージョン計画はかなり標準的で、メジャーリリースはインターフェイスを中断し、マイナーリリースはインターフェイスを追加しますが、それでも以前のバージョンと互換性があり、パッチ番号はインターフェイスを含まないバグ修正/改善です。これは、マイナーがSOバージョンを増やす必要があることを意味します。
したがって、ライブラリのファイル名はlibNAME.so.X.Y.Z
ライブラリのバージョンX.Y.Z
であり、インストール名はlibNAME.so.X.Y
。私の問題は、マイナーバージョンを更新するときに既存のリンクされた実行可能ファイルが新しいライブラリを使用したいのですが(X.0.0と互換性がないため)、実行可能ファイルが古いマイナーバージョンにリンクされていることですlibNAME.so.X.Y
。もしそうなら、これは現在のバージョンの下のすべてのマイナーバージョンのシンボリックリンクのリストを維持し、共有ライブラリをアップグレードするたびに新しいライブラリを指すようにすべてを更新する必要があることを意味しますか?
答え1
ライブラリを使用するプログラムは、libNAME.so
最新バージョン、libNAME.so.X
最新メジャーバージョンX
、libNAME.so.X.Y
特定のマイナーバージョンを必要に応じてリンクする必要があります。
追加リンクのみを提供するlibNAME.so
場合libNAME.so.X
そして libNAME.so.X.Y
すべてlibNAME.so.X.Y.Z
最新バージョンを使用し、いつでもこのリンクを更新できます。
インストールするバージョンがマイナーバージョンにアップグレードされたと仮定すると、リンクは次のようになります(Y-1はYより前の数字で、zはXY-1シリーズの最新のパッチレベルであると仮定)。
libNAME.so -> libNAME.so.X.Y-1.z
libNAME.so.X -> libNAME.so.X.Y-1.z
libNAME.so.X.Y-1 -> libNAME.so.X.Y-1.z
アップデートをインストールした後(Zは0または1です):
libNAME.so -> libNAME.so.X.Y.Z
libNAME.so.X -> libNAME.so.X.Y.Z
libNAME.so.X.Y-1 -> libNAME.so.X.Y-1.z
libNAME.so.X.Y -> libNAME.so.X.Y.Z
XY-1を使用するように明示的にリンクされているすべてのプログラムは、まだXY-1.zファイルを探します。
このスキームによれば、表示されたリンクを除く古いリンクを更新する必要はなく、メジャー、マイナー、またはパッチ番号の変更(1、2、resp 3リンク)からどのリンクがあるかを確認できます。
以前は、システムにこれらの「中間」リンクを持つ古いリポジトリを持つ方が一般的でした。ただし、パッケージ管理はしばしば古いバージョンを削除します。
^私は、以前のバージョンを使用するように明示的な要求を受け取っていない場合は、リンクを介して最新バージョンを入手することができます。 Microsoft MFCカンファレンス(1994)では、DLLは次のように導入されました。解決策共有ライブラリの場合、私はそのような証明されたスキームなしで以前のバージョンにアクセスする問題を講演者に指摘しました。 「DLL地獄」という用語は、その時点でもまだ作成されていません。