web-dev-qa-db-ja.com

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)

これらの特定のライブラリをダウンロードする方法を見つけようとしました。

4
cbullard

YUMとdepsに関する解説

YUMはこれを行います。しかし、それはRPMが指定するのと同じくらい良いだけです。この場合、RPMはそれが2.13を超えるGLIBCで動作することを示していますが、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コンパイラーを使用してビルドされたパッケージと、OSで実際に使用できるランタイムライブラリのパッケージを使用しようとしていることです。

あなたの場合、あなたは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. VMでアプリを実行する

  4. Dockerコンテナーでアプリを実行する
  5. OSのGCC設定と一致するシンボルを使用して構築されたバイナリを含むRPMのバージョンを取得します。

FedoraとCentOSの類似点を考えると、上記の多くで大きな成功を収めてきました。あなたは#5を試して、彼らのウェブサイトで古いFedora RPMの1つを試して、CentOSのバージョンのGCCシンボルでビルドされているかどうかを確認することができます。

参考文献

6
slm

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のWebサイトからダウンロードでき、インストールのチュートリアルがあります。インストール後、AnacondaのライブラリをLD_LIBRARY_PATHに追加できます。たとえば、/ opt/anaconda3にインストールした場合は、次の行を~/.bash_profileまたは~/.bashrcに追加します。

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

その後、新しいシェルセッションを開始し、トリリアンを再度実行できます。

パスに追加できる正しいライブラリを提供するソースコンパイルGCC6、GCC7、またはGCC8をソースコンパイルすることもできますが、ソースコンパイルGMP、MPC、およびMPFRをソースコンパイルする必要があります。 。

3
Nasir Riley

両方ありがとう-あなたの答えは非常に役に立ちました。

インストールするlibstdc ++ライブラリだけを見つけることができなかったので、Anaconda3のインストールに進みました。これは私にその特定の問題を乗り越えさせましたが、私に別の問題を提示するだけでした:

$トリリアントリリアン:シンボルルックアップエラー:トリリアン:未定義のシンボル:_ZN4Glib25filename_display_basenameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

だから今、私はその問題の解決策を探しに行きます。どんな提案も歓迎します、そして私がこれまでのところ到達するのを助けてくれてありがとう!

0
cbullard