安装 RPM 时对 libstdc++(GLIBCXX_...) 的依赖失败
Failed dependency on libstdc++(GLIBCXX_...) when installing 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 中设置它似乎没有帮助(我可以看到它是用 echo 在同一个 shell 中设置的我是 运行 rpm -i from).
我需要设置哪些变量(以及在哪里)才能让 RPM 安装程序了解我的 libstdc++ 在哪里?
问题是 rpm
与 "metadata" 一起工作。官方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 这样做。我看到有多种方法可以解决这个问题;按照我的喜好顺序:
- rebuild libstdc++ 4.3.9 rpm 自己安装;那么所有的依赖关系都会很好地工作(你可以查看 here 来找到 gcc*src.rpm)。至于我;这是唯一面向未来的解决方案!
- 打包 my-rpm 时;使用选项
AutoReqProv: no
;告诉 rpm
不要自动扫描他的要求。当然你可能 运行 陷入依赖问题;您必须在其中手动确定和安装依赖项。
- 安装 my-rpm 时;使用选项
--nodeps
忽略依赖项。这可能会导致其他依赖项出现问题(因为现在 所有 依赖项都将被忽略)。
我有一个 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 中设置它似乎没有帮助(我可以看到它是用 echo 在同一个 shell 中设置的我是 运行 rpm -i from).
我需要设置哪些变量(以及在哪里)才能让 RPM 安装程序了解我的 libstdc++ 在哪里?
问题是 rpm
与 "metadata" 一起工作。官方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 这样做。我看到有多种方法可以解决这个问题;按照我的喜好顺序:
- rebuild libstdc++ 4.3.9 rpm 自己安装;那么所有的依赖关系都会很好地工作(你可以查看 here 来找到 gcc*src.rpm)。至于我;这是唯一面向未来的解决方案!
- 打包 my-rpm 时;使用选项
AutoReqProv: no
;告诉rpm
不要自动扫描他的要求。当然你可能 运行 陷入依赖问题;您必须在其中手动确定和安装依赖项。 - 安装 my-rpm 时;使用选项
--nodeps
忽略依赖项。这可能会导致其他依赖项出现问题(因为现在 所有 依赖项都将被忽略)。