我的 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 的地方,应该是符号链接的实际上是与它们应该指向的库 相同 的文件。所以,我删除了应该是符号链接的内容,然后重新创建了它们。这消除了错误。