9

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

 --> 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 之外,这很好。

 [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

我已经尝试了各种提供:规范文件中的行无济于事,任何人都可以看到有什么问题吗?

编辑

[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

提取的文件也看起来不错:

[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
4

3 回答 3

12

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

将这样的内容添加到您的%install部分:

find %buildroot -type f \( -name '*.so' -o -name '*.so.*' \) -exec chmod 755 {} +

来源

于 2016-10-02T17:58:48.283 回答
3

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

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

这是该答案中最重要的部分,为了清晰和语法而进行了轻微编辑:

soname用于指示您的库支持的二进制 api 兼容性。

SONAME链接器在编译时使用它来从库文件中确定实际的目标库版本是什么。gcc -lNAME将寻找 lib NAME.so (符号链接或文件)然后提取它SONAME肯定会更具体(例如 libfoo.so 链接到包含libfoo.so.1 的SONAMElibfoo.so.1.2.4)。

这是语法:

gcc -shared -fPIC -Wl,-soname,libfoo.so.1 -o libfoo.so.1.2.4 foo.c

另请参阅“创建共享库”的程序库 HOWTO部分以获得进一步的解释。

于 2020-02-25T17:46:59.657 回答
2

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

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

除非您正在打包预构建的库,或者除非您正在为相同的 RPM 构建 32 位和 64 位库(并且未能安装后者,或者将两者都安装到相同的位置,否则错误的库架构是不可能的一个破坏另一个)。

由于您自己开发 RPM,我想您知道您是否在使用自动提供。

于 2014-12-12T14:51:53.290 回答