Centos 7,我认为“yum install ___”也应该获得所有依赖项?

Centos 7,我认为“yum install ___”也应该获得所有依赖项?

我想将 Trillian 安装到我的 CentOS 7 机器上。我去www.trillian.im/get/linux/6.1/linux.html下载了rpm包trillian-6.1.0.5-1.fc25.x86_64.rpm。

据我了解,使用:

$ yum install trillian-6.1.0.5-1.fc25.x86_64.rpm

将安装该包,并检查并检索解决依赖关系所需的任何其他文件。显然没有找到任何:

Marking trillian-6.1.0.5-1.fc25.x86_64.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package trillian.x86_64 0:6.1.0.5-1.fc25 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package    Arch     Version            Repository                         Size
================================================================================
Installing:
 trillian   x86_64   6.1.0.5-1.fc25     /trillian-6.1.0.5-1.fc25.x86_64    30 M

Transaction Summary
================================================================================
Install  1 Package

.
.
.

Installed:
  trillian.x86_64 0:6.1.0.5-1.fc25                                              

Complete!

但是,当我尝试运行该程序时,我得到以下信息:

$ trillian
trillian: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by trillian)
trillian: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by trillian)

我试图找到一种方法来下载这些特定的库。

答案1

YUM 和 deps 的评论

百胜确实做到了这一点。但它仅与 RPM 指定的一样好。在这种情况下,您的 RPM 声明它可以与任何 GLIBC > 2.13 一起使用,但它显然是使用特定版本的 GLIBC 构建的,并且只有在系统上有适当的 GCC 符号时才可以工作:

$ rpm -qpR trillian-6.1.0.5-1.fc25.x86_64.rpm
atkmm >= 2.22.0
cairo >= 1.12.0
cairomm >= 1.10.0
gdk-pixbuf2 >= 2.26.0
glib2 >= 2.30.0
glibc >= 2.13
glibmm24 >= 2.32.0
gtk3 >= 3.4.0
gtkmm30 >= 3.4.0
libX11 >= 1.5.0
libXScrnSaver >= 1.2.0
libnotify >= 0.7.5
librsvg2-tools >= 2.36.0
libsigc++20 >= 2.2.10
libzip >= 0.10.0
openssl-libs >= 1:1.0.1
pango >= 1.30.0
pangomm >= 2.28.0
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
zlib >= 1.2.0

您可以使用它rpm -qpR <rpm>来确定它需要哪些依赖项。

有关您的问题的更多信息

问题的核心是您尝试使用使用不同版本的 GCC 编译器构建的包,而不是操作系统上实际可用的运行时库。

就您而言,您使用的是 CentOS 7.x,并且您确实不能像这样在 Fedora 和 CentOS 之间混合使用 RPM,或者至少您不应该这样做。

如果您查看哪个包拥有该共享库:

$ rpm -qf /lib64/libstdc++.so.6
libstdc++-4.8.5-28.el7_5.1.x86_64

您还可以研究共享库本身以查看它支持哪些 GCC 符号:

$ nm -D /lib64/libstdc++.so.6 | grep -i GLIBC | head -5
0000000000000000 A GLIBCXX_3.4
0000000000000000 A GLIBCXX_3.4.1
0000000000000000 A GLIBCXX_3.4.10
0000000000000000 A GLIBCXX_3.4.11
0000000000000000 A GLIBCXX_3.4.12

最后查看它是否包含该 RPM 的二进制文件正在寻找的内容:

$ nm -D /lib64/libstdc++.so.6 | grep -iE '3\.4\.20|3\.4\.21'
$

毫不奇怪,这个.so库不包含这两个版本的 GCC 的符号,因此会出现错误。

该怎么办?

处理此问题的典型方法是:

  1. 获取根据 GCC 符号定义构建的二进制文件
  2. 从其他一些工具获取libstdc++.so.6库(许多应用程序选择包含库以便于部署/设置/安装)并通过您的LD_LIBRARY_PATH.你通常会这样做:

    $ LD_LIBRARY_PATH=/path/to/lib trillian
    
  3. 在虚拟机中运行应用程序

  4. 在 Docker 容器中运行应用程序
  5. 获取一个 RPM 版本,其中包含使用与操作系统的 GCC 设置一致的符号构建的二进制文件。

鉴于 Fedora 和 CentOS 之间的相似之处,我在上述许多方面都取得了良好的成功。您可以尝试#5,并在其网站上尝试其中一个较旧的 Fedora RPM,看看它是否是使用 CentOS 版本的 GCC 符号构建的。

参考

答案2

yum解决与其他包的依赖关系。换句话说,它会安装您尝试安装的软件包所依赖的软件包。

您收到的错误是由于库文件 /lib64/libstdc++.so.6 不包含GLIBCXX_3.4.20GLIBCXX_3.4.21。通常, /usr/lib64/libstdc++.so.6 是 /usr/lib64/libstdc++.so.6.0.# 的符号链接,其中 # 是内部 GLIBCXX 的最高版本。

如果运行此命令,您将看到包含的 GLIBCXX 版本:

strings /usr/lib64/libstdc++.so.6 | grep -i ^glibcxx_

由于您没有它,因此您需要安装包含这些库的包。

提供它的最简单的安装包是:

蟒蛇3

您可以从 Anaconda 的网站下载它,并且有安装它的演练。安装后,您可以将 Anaconda 的库添加到 LD_LIBRARY_PATH 中。例如,如果您将其安装到 /opt/anaconda3 中,那么您将将此行添加到您的~/.bash_profileor 中~/.bashrc

export LD_LIBRARY_PATH=/opt/anaconda3/lib:$LD_LIBRARY_PATH

然后您可以启动一个新的 shell 会话并再次运行 trillian。

您还可以源编译 GCC6、GCC7 或 GCC8,它们将提供正确的库,然后您可以将其添加到路径中,但您还必须源编译 GMP、MPC 和 MPFR,在您的情况下,这比它的价值更麻烦。

答案3

谢谢你们俩——你们的回答非常有帮助。

我未能成功找到要安装的 libstdc++ 库,因此我选择了 Anaconda3 安装。这让我克服了这个具体问题,只是向我提出了另一个问题:

$ trillian trillian:符号查找错误:trillian:未定义符号:_ZN4Glib25filename_display_basenameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

所以现在我要寻找解决这个问题的方法。欢迎提出任何建议,并再次感谢你们帮助我走到这一步!

相关内容