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

cbu*_*ard 4 yum libraries centos dependencies shared-library

我想将 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
Run Code Online (Sandbox Code Playgroud)

将安装软件包并检查和检索解决依赖项所需的任何其他文件。它显然没有找到任何:

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!
Run Code Online (Sandbox Code Playgroud)

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

$ 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)
Run Code Online (Sandbox Code Playgroud)

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

slm*_*slm 6

YUM & deps 评论

YUM 做到了这一点。但它仅与 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
Run Code Online (Sandbox Code Playgroud)

您可以使用它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
Run Code Online (Sandbox Code Playgroud)

您还可以调查共享库本身以查看它支持哪些 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
Run Code Online (Sandbox Code Playgroud)

最后看看它是否包括这个 RPM 的二进制文件正在寻找的那些:

$ nm -D /lib64/libstdc++.so.6 | grep -iE '3\.4\.20|3\.4\.21'
$
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,这个.so库不包含这些 GCC 版本中的任何一个的符号,因此是错误的。

该怎么办?

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

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

    $ LD_LIBRARY_PATH=/path/to/lib trillian
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在 VM 中运行应用程序

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

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

参考