安装RPM时对libstdc ++(GLIBCXX _...)的依赖失败

时间:2016-08-02 11:30:19

标签: c++ gcc rpm

我有一个linux盒子,我已经编译并安装了更新版本的GCC(4.3.9),它存在于/ usr / lib中。

我使用这个编译器构建了一组捆绑到RPM中的库,但是当我尝试安装RPM时,会出现以下错误:

rpm -ivh my-rpm.i586.rpm  
error: Failed dependencies:  
    libstdc++.so.6(GLIBCXX_3.4.10) is needed by my-rpm.i586  
    libstdc++.so.6(GLIBCXX_3.4.11) is needed by my-rpm.i586  
    libstdc++.so.6(GLIBCXX_3.4.15) is needed by my-rpm.i586  
    libstdc++.so.6(GLIBCXX_3.4.20) is needed by my-rpm.i586  
    libstdc++.so.6(GLIBCXX_3.4.9) is needed by my-rpm.i586

我知道这些符号是由我编译的gcc提供的:

strings /usr/lib/libstdc++.so.6 | grep GLIBCXX  
...  
GLIBCXX_3.4.10  
GLIBCXX_3.4.11  
...   
GLIBCXX_3.4.15  
...   
GLIBCXX_3.4.20  

如果我对打包到RPM中的任何.so文件执行ldd,我可以看到它正在期待正确的libstdc ++:

ldd BUILDROOT/usr/lib/libfoo.so  
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7635000)

所以我认为我唯一的问题是让RPM的依赖解析器看起来正确。 This answer暗示LD_LIBRARY_PATH决定了搜索路径,但在我的.bashrc中设置它似乎没有帮助(我可以看到它在同一个shell中设置为echo我运行rpm -i)

我需要设置哪些变量(以及在何处)让RPM安装程序了解libstdc ++的位置?

1 个答案:

答案 0 :(得分:2)

问题是rpm与“元数据”一起使用。官方libstdc ++ 6包提供

...
libstdc++.so.6(GLIBCXX_3.4.10)
libstdc++.so.6(GLIBCXX_3.4.11)
...

rpm不会开始调查已安装的/usr/lib/libstdc++.so.6以查看它是否提供GLIBCXX_3.4.10。 Afaik没有办法告诉rpm这样做。我看到了解决这个问题的多种方法;按照我的偏好顺序:

  1. 重建 libstdc ++ 4.3.9 rpm并自行安装;然后所有的依赖项都会很好(你可以看here找到gcc * src.rpm)。至于我;这是唯一面向未来的解决方案!
  2. 包装my-rpm时;使用选项AutoReqProv: no;告诉rpm不要自动扫描他的要求。当然,你可能遇到依赖问题;你必须手动确定和安装依赖项。
  3. 安装my-rpm时;使用选项--nodeps忽略依赖项。这可能会导致其他依赖项出现问题(因为现在所有依赖项都将被忽略)。