共享库文件名中的版本指示

共享库文件名中的版本指示

我现在正在开发一个跨平台共享库,我对它在 *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.solibNAME.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 地狱”这个词仍然需要在那时发明。

相关内容