Centos 7, "yum install ___"도 모든 종속성을 가져와야 한다고 생각했나요?

Centos 7, "yum install ___"도 모든 종속성을 가져와야 한다고 생각했나요?

내 CentOS 7 컴퓨터에 Trillian을 설치하고 싶습니다. 저는 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의 댓글

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

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. 운영 체제의 GCC 설정과 일치하는 기호로 작성된 바이너리가 포함된 RPM 버전을 얻습니다.

Fedora와 CentOS의 유사점을 고려하면 위의 많은 항목에서 좋은 성공을 거두었습니다. #5를 시도하고 웹 사이트에서 이전 Fedora RPM 중 하나를 시도하여 CentOS 버전의 GCC 기호로 구축되었는지 확인할 수 있습니다.

인용하다

답변2

yum다른 패키지와의 종속성을 해결합니다. 즉, 설치하려는 패키지가 종속된 패키지를 설치합니다.

발생하는 오류는 라이브러리 파일 /lib64/libstdc++.so.6에 GLIBCXX_3.4.20또는 가 포함되어 있지 않기 때문입니다 GLIBCXX_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_profile또는 에 다음 줄을 추가합니다 ~/.bashrc.

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

그런 다음 새 셸 세션을 시작하고 trillian을 다시 실행할 수 있습니다.

경로에 추가할 수 있는 올바른 라이브러리를 제공하는 GCC6, GCC7 또는 GCC8을 소스 컴파일할 수도 있지만, 값보다 더 나은 GMP, MPC 및 MPFR도 소스 컴파일해야 합니다.

답변3

두 분 모두 감사드립니다. 귀하의 답변이 매우 도움이 되었습니다.

설치할 libstdc++ 라이브러리를 찾지 못했기 때문에 Anaconda3 설치를 선택했습니다. 이로 인해 이 특정 문제를 극복하고 또 다른 질문이 생겼습니다.

$trillian trillian: 기호 조회 오류: trillian: 정의되지 않은 기호: _ZN4Glib25filename_display_basenameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

그래서 지금 나는 이 문제에 대한 해결책을 찾고 있습니다. 어떤 제안이라도 환영하며 이 지점에 도달하는 데 도움을 주셔서 다시 한번 감사드립니다!

관련 정보