Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux rpmbuild不包括符号链接共享对象作为_Linux_Shared Libraries_Rpm_Yum_Rpmbuild - Fatal编程技术网

Linux rpmbuild不包括符号链接共享对象作为

Linux rpmbuild不包括符号链接共享对象作为,linux,shared-libraries,rpm,yum,rpmbuild,Linux,Shared Libraries,Rpm,Yum,Rpmbuild,我正在构建一个RPM,它基本上只是打包了一组供应商提供的二进制文件,这样它们就可以用于我们的内部应用程序,也可以通过RPM安装 其中一个库附带了多个版本——libexample_base.so和libexample_debug.so(以及其他版本)。我目前正在尝试将这些文件打包,以便它们都包含在RPM中(以便开发人员可以在需要时在它们之间切换),但选择libexample_base.so作为默认版本,方法是在%install期间创建一个符号链接,然后将其打包为RPM中的一个文件 %install

我正在构建一个RPM,它基本上只是打包了一组供应商提供的二进制文件,这样它们就可以用于我们的内部应用程序,也可以通过RPM安装

其中一个库附带了多个版本——libexample_base.so和libexample_debug.so(以及其他版本)。我目前正在尝试将这些文件打包,以便它们都包含在RPM中(以便开发人员可以在需要时在它们之间切换),但选择libexample_base.so作为默认版本,方法是在%install期间创建一个符号链接,然后将其打包为RPM中的一个文件

%install
[... Copy the files from the tarball to the buildroot ...]
pushd %{buildroot}%{_libdir}
ln -sf libexample_base.so libexample.so
popd
这很有效。。。除了一个问题。它使用自动依赖项生成,虽然它提供了所有共享对象,但它没有提供libexample.so,尽管符号链接位于%文件中,并且安装正确。不幸的是,供应商库不提供SONAME条目,并且由于它们是二进制blob,我无法轻松添加它们,因此RPM取决于实际的文件名。所有下游RPM都需要libexample.so,并且由于此RPM没有将其列为requires,因此它们拒绝安装,因为缺少依赖项,即使do实际可以工作(ldconfig可以找到libexample.so而没有问题)


关于如何提示rpmbuild将符号链接解析为提供的符号链接,有什么想法吗?

经过进一步的研究,我确定我试图做的是不可能的,以及原因。核心问题归结为rpmbuild的行为,它是为了正确处理生成的带有SONAME条目的共享对象而构建的。它没有明确列出指向以.so结尾的共享对象的符号链接,因为在正常行为中,这些符号链接指向版本化的共享对象(.so.#.#),你的应用程序应该依赖于那些版本化的对象——符号链接应该包含在devel包中,只是为了让你的链接器能够找到最新的

我遇到了第二种情况,当事情没有正确完成时,它会用作备份—对于RPM和GCC,当不存在SONAME时,它会使用文件名。当我运行GCC时,文件名是libexample.so(指向真实文件的符号链接),它没有SONAME,所以它只是将自己配置为链接到libexample.so;rpmbuild看到这一点,并将其设置为应用程序RPM的一个要求。但是,由于rpmbuild显式地将该名称从库rpm中排除,因为它看起来像一个devel链接,因此无法协调这两个rpm


解决方案是什么?现在,我正在使用我的变通方法,只是制作文件的副本——当有一个具有该名称的物理文件时,它就工作了。正确的方法是修复共享对象,尽管我需要去上游供应商那里才能完成。

我确实找到了一个黑客解决方法-如果我硬链接文件而不是符号链接,它就可以工作。不过我真的不想这样做,因为它包含完整文件两次,并且它的目的是让一个人能够更改链接指向的位置。与其显式调用
ln-s
,不如将/usr/sbin/ldconfig放在规范文件的%post部分谢谢您回来并给出答案。现在您已经完成了所有链接,是否可以将符号链接保留在RPM中,并将“
提供:libexample.so
”添加到规范文件中?