我的 RPM 中缺少库(但我知道它们在那里)
Missing libraries in my RPM (but I know they are there)
我有一个 RPM,我正试图在我的 VM 中安装它。我的 RPM 名为 myPackage.rpm,当我尝试安装它 (yum install myPackage.rpm
) 时,出现以下错误:
Error: Package: myPackage.x86_64 (/myPackage)
Requires: libicudata.so.32()(64bit)
Error: Package: myPackage.x86_64 (/myPackage)
Requires: libicuuc.so.32()(64bit)
Error: Package: myPackage.x86_64 (/myPackage)
Requires: libicui18n.so.32()(64bit)
我 rpm2cpio myPackage.rpm|cpio -idvm
从我的 rpm 中提取所有文件(在 /root/rpms 中)。
我查找了 libicudata.so*,结果显示如下:
/root/rpms/usr/lib64/libicudata.so.32.0
/root/rpms/usr/lib64/libicudata.so.32
/root/rpms/usr/lib64/libicudata.so
/root/rpms/usr/lib/libicudata.so.32.0
/root/rpms/usr/lib/libicudata.so.32
/root/rpms/usr/lib/libicudata.so
/usr/lib64/libicudata.so.32.0
/usr/lib64/libicudata.so.32
/usr/lib64/libicudata.so.50.1.2
/usr/lib64/libicudata.so.50
/usr/lib/libicudata.so.32.0
/usr/lib/libicudata.so.32
/usr/lib/libicudata.so.50.1.2
/usr/lib/libicudata.so.50
/root/rpms/usr/
中列出的文件是我的rpm文件,其他文件安装在VM中。
我不确定我做错了什么以及为什么。我是否错误地打包了我的 RPM?
1) rpm 不关心你在你的文件系统上实际安装了什么。如果您以某种方式将库放在那里,则 rpm 不在乎。 rpm 只检查 rpmdb.
2) 依赖项只是字符串。因此,如果 rpm 告诉您它需要 libicudata.so.32()(64bit)
。然后它不会检查库名称和 libicudata 的 64 位版本。 Rpm 只做最简单的事情。 Rpm 检查是否有一些包提供了这个字符串。所以检查你的包裹:
rpm -qp --provides ./foo.rpm
如果它提供了这个字符串。
rpmbuild 有 built-in 检查,可以检测库的存在,然后自动插入提供:
Provides: libicudata.so.32()(64bit)
如果您确定 rpmbuild 不正确,您可以手动指定提供。
我发现了我的错误。在我创建 RPM 之前,ICU 的所有库文件都被弄乱了。我 运行 ldconfig
它给了我类似这样的错误信息:
ldconfig: /lib/libicudata.so.32 is not a symbolic link
在我构建 RPM 的地方,应该是符号链接的实际上是与它们应该指向的库 相同 的文件。所以,我删除了应该是符号链接的内容,然后重新创建了它们。这消除了错误。
我有一个 RPM,我正试图在我的 VM 中安装它。我的 RPM 名为 myPackage.rpm,当我尝试安装它 (yum install myPackage.rpm
) 时,出现以下错误:
Error: Package: myPackage.x86_64 (/myPackage)
Requires: libicudata.so.32()(64bit)
Error: Package: myPackage.x86_64 (/myPackage)
Requires: libicuuc.so.32()(64bit)
Error: Package: myPackage.x86_64 (/myPackage)
Requires: libicui18n.so.32()(64bit)
我 rpm2cpio myPackage.rpm|cpio -idvm
从我的 rpm 中提取所有文件(在 /root/rpms 中)。
我查找了 libicudata.so*,结果显示如下:
/root/rpms/usr/lib64/libicudata.so.32.0
/root/rpms/usr/lib64/libicudata.so.32
/root/rpms/usr/lib64/libicudata.so
/root/rpms/usr/lib/libicudata.so.32.0
/root/rpms/usr/lib/libicudata.so.32
/root/rpms/usr/lib/libicudata.so
/usr/lib64/libicudata.so.32.0
/usr/lib64/libicudata.so.32
/usr/lib64/libicudata.so.50.1.2
/usr/lib64/libicudata.so.50
/usr/lib/libicudata.so.32.0
/usr/lib/libicudata.so.32
/usr/lib/libicudata.so.50.1.2
/usr/lib/libicudata.so.50
/root/rpms/usr/
中列出的文件是我的rpm文件,其他文件安装在VM中。
我不确定我做错了什么以及为什么。我是否错误地打包了我的 RPM?
1) rpm 不关心你在你的文件系统上实际安装了什么。如果您以某种方式将库放在那里,则 rpm 不在乎。 rpm 只检查 rpmdb.
2) 依赖项只是字符串。因此,如果 rpm 告诉您它需要 libicudata.so.32()(64bit)
。然后它不会检查库名称和 libicudata 的 64 位版本。 Rpm 只做最简单的事情。 Rpm 检查是否有一些包提供了这个字符串。所以检查你的包裹:
rpm -qp --provides ./foo.rpm
如果它提供了这个字符串。
rpmbuild 有 built-in 检查,可以检测库的存在,然后自动插入提供:
Provides: libicudata.so.32()(64bit)
如果您确定 rpmbuild 不正确,您可以手动指定提供。
我发现了我的错误。在我创建 RPM 之前,ICU 的所有库文件都被弄乱了。我 运行 ldconfig
它给了我类似这样的错误信息:
ldconfig: /lib/libicudata.so.32 is not a symbolic link
在我构建 RPM 的地方,应该是符号链接的实际上是与它们应该指向的库 相同 的文件。所以,我删除了应该是符号链接的内容,然后重新创建了它们。这消除了错误。