首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在rpm文件中显示rpm安装的“缺失”lib

在rpm文件中显示rpm安装的“缺失”lib
EN

Stack Overflow用户
提问于 2014-12-12 14:37:31
回答 3查看 7.2K关注 0票数 9

我正在为centos生成一个rpm文件,但是当我试图在干净的机器上安装它时,它会失败:

代码语言:javascript
复制
 --> Running transaction check
 ---> Package grass.x86_64 0:6.4.4-1.el6 will be installed
 --> Processing Dependency: libgrass_rli.so()(64bit) for package: grass-6.4.4-1.el6.x86_64
 --> Finished Dependency Resolution Error: Package: grass-6.4.4-1.el6.x86_64 (/grass-6.4.4-1.el6.x86_64)
            Requires: libgrass_rli.so()(64bit)

这很好,除非rpm包含libgrass_rli.so。

代码语言:javascript
复制
 [vagrant@localhost ~]$ rpm -qilp /vagrant_rpms/grass-6.4.4-1.el6.x86_64.rpm | grep _rli
 /usr/local/lib/libgrass_rli.6.4.4.so 
 /usr/local/lib/libgrass_rli.so

我已经尝试过各种提供:在规范文件中的行是无效的,有人能看到什么问题吗?

编辑

代码语言:javascript
复制
[vagrant@localhost ~]$ rpm -qp --provides /vagrant_rpms/grass-6.4.4-1.el6.x86_64.rpm                                                                            
libgrass_I.6.4.4.so()(64bit)                                                    
libgrass_Iortho.6.4.4.so()(64bit)                                               
libgrass_arraystats.6.4.4.so()(64bit)                                           
libgrass_bitmap.6.4.4.so()(64bit)                                               
libgrass_btree.6.4.4.so()(64bit)                                                
libgrass_cdhc.6.4.4.so()(64bit)                                                 
libgrass_cluster.6.4.4.so()(64bit)                                              
libgrass_datetime.6.4.4.so()(64bit)                                             
libgrass_dbmibase.6.4.4.so()(64bit)                                             
libgrass_dbmiclient.6.4.4.so()(64bit)                                           
libgrass_dbmidriver.6.4.4.so()(64bit)                                           
libgrass_dbstubs.6.4.4.so()(64bit)                                              
libgrass_dgl.6.4.4.so()(64bit)                                                  
libgrass_dig2.6.4.4.so()(64bit)                                                 
libgrass_display.6.4.4.so()(64bit)                                              
libgrass_driver.6.4.4.so()(64bit)                                               
libgrass_dspf.6.4.4.so()(64bit)
libgrass_edit.6.4.4.so()(64bit)
libgrass_form.6.4.4.so()(64bit)
libgrass_g3d.6.4.4.so()(64bit)
libgrass_gis.6.4.4.so()(64bit)
libgrass_gmath.6.4.4.so()(64bit)
libgrass_gpde.6.4.4.so()(64bit)
libgrass_gproj.6.4.4.so()(64bit)
libgrass_interpdata.6.4.4.so()(64bit)
libgrass_interpfl.6.4.4.so()(64bit)
libgrass_lidar.6.4.4.so()(64bit)
libgrass_linkm.6.4.4.so()(64bit)
libgrass_lrs.6.4.4.so()(64bit)
libgrass_neta.6.4.4.so()(64bit)
libgrass_nviz.6.4.4.so()(64bit)
libgrass_ogsf.6.4.4.so()(64bit)
libgrass_pngdriver.6.4.4.so()(64bit)
libgrass_psdriver.6.4.4.so()(64bit)
libgrass_qtree.6.4.4.so()(64bit)
libgrass_raster.6.4.4.so()(64bit)
libgrass_rli.6.4.4.so()(64bit)
libgrass_rli.so
libgrass_rowio.6.4.4.so()(64bit)
libgrass_rtree.6.4.4.so()(64bit)
libgrass_segment.6.4.4.so()(64bit)
libgrass_shape.6.4.4.so()(64bit)
libgrass_sim.6.4.4.so()(64bit)
libgrass_sites.6.4.4.so()(64bit)
libgrass_sqlp.6.4.4.so()(64bit)
libgrass_stats.6.4.4.so()(64bit)
libgrass_symb.6.4.4.so()(64bit)
libgrass_trans.6.4.4.so()(64bit)
libgrass_vask.6.4.4.so()(64bit)
libgrass_vect.6.4.4.so()(64bit)
libgrass_vedit.6.4.4.so()(64bit)
grass = 6.4.4-1.el6
grass(x86-64) = 6.4.4-1.el6

此外,提取的文件看起来还可以:

代码语言:javascript
复制
[vagrant@localhost ~]$ file /tmp/libgrass_rli.6.4.4.so
/tmp/libgrass_rli.6.4.4.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-12 14:51:53

rpmbuild通常扫描打包到RPM中的所有文件,以自动识别RPM提供的共享库,并且RPM的需求可以自我满足。因此,有两种主要可能性:

  • 也许RPM包含库的i386 (即32位)版本,而64位版本是实际需要的版本,或者在其他方面打包的文件不是正确的类型;
  • 或者,rpmbuild的自动扫描可能已被禁用或损坏(这将是规范文件的一个功能)。

除非您正在打包预构建的库,或者除非您同时为相同的RPM构建32位和64位的库(并且未能安装后者,或者将两者安装到相同的位置,使其中一个失败),否则错误的库体系结构是不可能发生的。

既然您自己正在开发RPM,我想您应该知道您是否在使用自动提供程序。

票数 2
EN

Stack Overflow用户

发布于 2016-10-02 17:58:48

共享库没有被“自动提供”机制检测到的一个可能原因是它不是可执行的。

将类似的内容添加到您的%install部分:

代码语言:javascript
复制
find %buildroot -type f \( -name '*.so' -o -name '*.so.*' \) -exec chmod 755 {} +

来源

票数 12
EN

Stack Overflow用户

发布于 2020-02-25 17:46:59

如果其他现有答案都不适合您,请确保已为库设置了SONAME。这是通过“soname”链接器选项设置的,该选项添加元信息来指定库的共享对象名称。“最大RPM”指南的自动依赖部分很好地解释了这与rpm构建过程的关系。

这个答案 (针对另一个问题)很好地解释了SONAME的目的,问题本身也解释了语法。

以下是这个答案中最重要的部分,为了清晰和语法,略作编辑:

soname用于指示库所支持的二进制api兼容性。 链接器在编译时使用SONAME从库文件中确定实际的目标库版本。gcc -lNAME将寻找libNAME.so (符号链接或文件),然后提取一定更具体的SONAME (例如,包含SONAME libfoo.so.1的libfoo.so.1.2.4的libfoo.so链接)。

下面是语法:

代码语言:javascript
复制
gcc -shared -fPIC -Wl,-soname,libfoo.so.1 -o libfoo.so.1.2.4 foo.c

另请参阅程序库操作的“创建共享库”一节,以获得进一步的解释。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27445918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档