生成的RPM依赖自身包含的库却未声明提供该依赖的问题排查
问题:RPM包未声明提供自身包含的TAO库依赖
我正尝试使用外部构建完成的ACE和TAO库创建RPM包,spec文件内容如下:
Name: ace-tao Version: 6.5.3 Release: 1 Summary: ACE and TAO libraries License: other Vendor: My Corp Group: Applications/Engineering Packager: My Corp <info@example.com> Prefix: /usr/local/foo %description Contains the ACE and TAO libraries. %install mkdir -p %{buildroot}/%{prefix}/lib cp -f %{_sourcedir}/deps/libACE*.so.%{version} %{buildroot}/%{prefix}/lib/ cp -f %{_sourcedir}/deps/libTAO*.so.2.5.3 %{buildroot}/%{prefix}/lib/ ( cd %{buildroot}/%{prefix}/lib/ for lib in libTAO*.so.2.5.3; do ln -s $lib ${lib%.3} ln -s $lib ${lib%.5.3} ln -s $lib ${lib%.2.5.3} done ) %files %defattr(-,root,root,-) %{prefix}
TAO库要求存在指向libTAO*.so.2.5.3的软链接libTAO*.so、libTAO*.so.2和libTAO*.so.2.5,因此添加了上述ln命令。
使用rpmbuild -bb ace-tao.spec构建后得到ace-tao-6.5.3-1.x86_64.rpm包,但安装时出现如下警告:
15:16:32,868 WARN packaging: ace-tao-6.5.3-1.x86_64 requires libTAO.so.2.5.3()(64bit) 15:16:32,868 WARN packaging: ace-tao-6.5.3-1.x86_64 requires libTAO_CodecFactory.so.2.5.3()(64bit) 15:16:32,868 WARN packaging: ace-tao-6.5.3-1.x86_64 requires libTAO_10RTable.so.2.5.3()(64bit) ... snip ...
使用rpm -qRp ace-tao-6.5.3-1.x86_64.rpm检查包的依赖项,确实列出了这些库:
libTAO.so.2.5.3()(64bit) libTAO_AnyTypeCode.so.2.5.3()(64bit) libTAO_CodecFactory.so.2.5.3()(64bit) ... snip ...
但该RPM包并未声明提供这些库:
$ rpm --provides -qp ace-tao-6.5.3-1.x86_64.rpm ace-tao = 6.5.3-1 ace-tao(x86-64) = 6.5.3-1
尽管包内确实包含这些文件:
$ rpm -qlp ace-tao-6.5.3-1.x86_64.rpm | grep TAO /usr/local/foo/lib/libTAO.so /usr/local/foo/lib/libTAO.so.2 /usr/local/foo/lib/libTAO.so.2.5 /usr/local/foo/lib/libTAO.so.2.5.3 /usr/local/foo/lib/libTAO_AnyTypeCode.so /usr/local/foo/lib/libTAO_AnyTypeCode.so.2 /usr/local/foo/lib/libTAO_AnyTypeCode.so.2.5 /usr/local/foo/lib/libTAO_AnyTypeCode.so.2.5.3 /usr/local/foo/lib/libTAO_CodecFactory.so /usr/local/foo/lib/libTAO_CodecFactory.so.2 /usr/local/foo/lib/libTAO_CodecFactory.so.2.5 /usr/local/foo/lib/libTAO_CodecFactory.so.2.5.3 ... snip ...
请问这是什么原因?需要做哪些修改才能让RPM包声明提供它所包含的这些库?使用的是CentOS 7.9系统。
原因分析
- RPM的自动依赖/提供机制默认仅扫描标准库路径(如
/usr/lib、/usr/lib64)里的库文件,你的库安装在/usr/local/foo/lib,不在默认扫描范围内,因此rpmbuild无法自动识别这些库并生成Provides条目。 - 包内的库文件被其他库引用时,rpmbuild扫描到引用会生成
Requires条目,但因库不在标准路径,无法关联到自身的Provides,最终导致依赖警告。
解决方案
修改spec文件,让rpmbuild识别自定义路径下的库,具体修改如下:
修改后的完整spec文件
Name: ace-tao Version: 6.5.3 Release: 1 Summary: ACE and TAO libraries License: other Vendor: My Corp Group: Applications/Engineering Packager: My Corp <info@example.com> Prefix: /usr/local/foo # 配置rpmbuild扫描自定义库路径,生成正确的Provides和Requires %global __find_provides %{_rpmconfigdir}/find-provides %{prefix}/lib %global __find_requires %{_rpmconfigdir}/find-requires %{prefix}/lib %description Contains the ACE and TAO libraries. %install mkdir -p %{buildroot}/%{prefix}/lib cp -f %{_sourcedir}/deps/libACE*.so.%{version} %{buildroot}/%{prefix}/lib/ cp -f %{_sourcedir}/deps/libTAO*.so.2.5.3 %{buildroot}/%{prefix}/lib/ ( cd %{buildroot}/%{prefix}/lib/ # 为TAO库创建软链接 for lib in libTAO*.so.2.5.3; do ln -s $lib ${lib%.3} ln -s $lib ${lib%.5.3} ln -s $lib ${lib%.2.5.3} done # 为ACE库创建对应软链接 for lib in libACE*.so.%{version}; do ln -s $lib ${lib%.3} ln -s $lib ${lib%.5.3} ln -s $lib ${lib%.6.5.3} done ) # 安装后更新系统库缓存 %post /sbin/ldconfig # 卸载后更新系统库缓存 %postun /sbin/ldconfig %files %defattr(-,root,root,-) %dir %{prefix} %dir %{prefix}/lib %{prefix}/lib/libACE*.so* %{prefix}/lib/libTAO*.so*
关键修改点说明
- 指定依赖扫描路径:通过
%global __find_provides和%global __find_requires,强制rpmbuild扫描%{prefix}/lib下的库文件,自动生成对应的Provides条目。 - 添加ldconfig脚本:
%post和%postun阶段调用/sbin/ldconfig,确保系统能识别自定义路径下的库,这是rpm打包库文件的标准操作。 - 明确打包文件:在
%files段中精准列出库文件,而非直接包含整个%{prefix},既避免打包冗余文件,也让rpmbuild更准确地识别库文件属性。
验证修改效果
执行以下命令验证:
# 查看包的Provides条目 rpm --provides -qp ace-tao-6.5.3-1.x86_64.rpm
此时应能看到libTAO.so.2.5.3()(64bit)这类库的Provides声明,安装时的依赖警告也会消失。
内容的提问来源于stack exchange,提问作者flyx
相关产品推荐
相关产品推荐

