
我使用 建置了一個 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
我的問題是:如果我已經安裝了,為什麼 RPM 會給出錯誤libssl.so.1.1
?我的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
答案1
我的問題是:如果我已經安裝了,為什麼 RPM 會給出錯誤
libssl.so.1.1
?
您的 RPM 需要libssl.so.1.0.0
,而不需要libssl.so.1.1
(請參閱下文)。
我的RPM包依賴於
libssl.so.1.0.0
,所以它不應該相容嗎?據我所知,第一個數字定義了共享物件之間的 ABI 相容性,因此1.1
應該可以很好地處理1.0
依賴關係(如果我錯了,請糾正我)。
許多項目使用主編號作為向後相容性指標,但這不是必需的。要求的是具有相同soname的不同版本的庫能夠相容。這就是為什麼 RPM 要求被表示為 sonames 和庫符號(libc.so.6
, GLIBC_2.14
):soname 指示需要哪個庫,使用哪個 soname,符號指示需要哪個版本的庫(或更高版本)。 (來自庫開發人員的)保證是這樣工作的:任何使用給定版本的庫編譯的程式都可以與該版本或任何更高版本一起使用,只要 soname 保持不變;並且針對給定的版本化庫符號集編譯的任何程式都可以與任何版本的庫一起使用,具有相同的soname,它也提供所有這些版本化庫符號。
libssl
1.1 不向後相容 1.0;事實上遷移是相當困難的。針對 1.0 編譯的程式libssl
不能用於libssl
1.1。為了標記這一事實,這些庫具有不同的名稱。