共享庫文件名中的版本指示
我現在正在開發一個跨平台共享庫,我對它在 *nix 上的正確工作方式有點困惑。我的版本計劃非常標準,major 會破壞介面,minor 會添加到介面但仍與舊版本兼容,更新檔號是不涉及介面的 bug 修復/改進。這意味著未成年人必須增加 SO 版本。
因此,庫的文件名是
libNAME.so.X.Y.Z
library versionX.Y.Z
,安裝名稱是libNAME.so.X.Y
. 我的問題是,當我更新我的未成年人時,我希望現有的連結執行檔使用新庫(因為它們向後兼容到 X.0.0),但執行檔連結到舊的未成年人libNAME.so.X.Y
. 那麼,這是否意味著我需要為低於目前版本的所有次要版本維護一個符號連結列表,並在每次升級共享庫時將它們全部更新為指向新庫?
使用您的庫的程序
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、3 個連結)來確定哪些連結。
過去,在您的系統上使用這些“中間”連結擁有舊版本的庫更為常見。但包管理通常會刪除舊版本。¹
¹我一直很喜歡這種做事方式,如果沒有明確要求較舊的版本,則依靠連結為您提供最新版本。在 Microsoft MFC 會議 (1994) 上,DLL 被作為共享庫的解決方案提出,我向演講者指出,在沒有這種已經證明的方案的情況下訪問舊版本的問題。那個時候仍然需要發明“DLL 地獄”這個片語。