You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成的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*

关键修改点说明

  1. 指定依赖扫描路径:通过%global __find_provides和%global __find_requires,强制rpmbuild扫描%{prefix}/lib下的库文件,自动生成对应的Provides条目。
  2. 添加ldconfig脚本:%post和%postun阶段调用/sbin/ldconfig,确保系统能识别自定义路径下的库,这是rpm打包库文件的标准操作。
  3. 明确打包文件:在%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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:58:10