我已经使用 构建了一个 rpm 包rpmbuild
,该包具有以下依赖项:
51f32ecb00b7:/rpm # rpm -qpR pkg.rpm
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.5)(64bit)
libc.so.6(GLIBC_2.7)(64bit)
libcrypto.so.1.0.0()(64bit)
libcurl.so.4()(64bit)
libdl.so.2()(64bit)
libdl.so.2(GLIBC_2.2.5)(64bit)
libjson-c.so.2()(64bit)
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libpthread.so.0(GLIBC_2.3.2)(64bit)
libssl.so.1.0.0()(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
我正在尝试在运行 openSUSE 的机器上构建它。但是,我收到以下依赖错误:
51f32ecb00b7:/rpm # rpm -U pkg.rpm
error: Failed dependencies:
libcrypto.so.1.0.0()(64bit) is needed by pkg.noarch
libjson-c.so.2()(64bit) is needed by pkg.noarch
libssl.so.1.0.0()(64bit) is needed by pkg.noarch
我的问题是关于 libssl 依赖项。我的系统中存在以下共享对象:
51f32ecb00b7:/rpm # find / | grep libssl*.so
/lib64/libss.so.2
/lib64/libss.so.2.0
/usr/lib64/libss.so.2
/usr/lib64/libss.so.2.0
/usr/lib64/libssl.so.1.1
libssl.so.1.1
我的问题是:如果我已安装,为什么 RPM 会给我错误?我的 RPM 包依赖libssl.so.1.0.0
,所以不应该兼容吗?据我所知,第一个数字定义了共享对象之间的 ABI 兼容性,因此1.1
应该可以正常使用1.0
dependency 。
最后,如果我运行:
51f32ecb00b7:/rpm # zypper install libopenssl1_0_0
51f32ecb00b7:/rpm # find / | grep libssl*.so
/lib64/libss.so.2
/lib64/libss.so.2.0
/usr/lib64/libss.so.2
/usr/lib64/libss.so.2.0
/usr/lib64/libssl.so.1.1
/usr/lib64/libssl.so.1.0.0
现在,有了/usr/lib64/libssl.so.1.0.0
,它的工作原理:
51f32ecb00b7:/rpm # rpm -U pkg.rpm
error: Failed dependencies:
libjson-c.so.2()(64bit) is needed by pkg.noarch
您的 RPM 需要
libssl.so.1.0.0
,而不是libssl.so.1.1
(见下文)。许多项目使用主编号作为向后兼容性指标,但这不是必需的。需要的是具有相同 soname 的不同版本的库是兼容的。这就是为什么 RPM 要求用 sonames 和库符号 (
libc.so.6
,GLIBC_2.14
) 表示的原因:soname 指示需要哪个库,使用哪个 soname,符号指示需要哪个版本的库(或更高版本)。保证(来自库开发人员)是这样工作的:只要 soname 保持不变,任何使用给定版本的库编译的程序都可以与该版本或任何更高版本一起使用;并且针对给定的一组版本化库符号编译的任何程序都可以与任何版本的库一起使用,具有相同的 soname,它还提供所有这些版本化的库符号。libssl
1.1 不向后兼容 1.0;事实上,迁移是相当困难的。针对libssl
1.0 编译的程序不能与libssl
1.1 一起使用。为了标记这一事实,图书馆有不同的声名。