Centos 7, я думал, что «yum install ___» тоже должен был получить все зависимости?

Я пытаюсь вернуться в * nix снова через много лет, и у меня возникают некоторые головные боли, которые, я надеюсь, вы можете помочь мне.

Я хочу установить Trillian на мой CentOS 7 box. Я пошел на 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) 

Я пытался найти способ загрузить эти конкретные библиотеки, но до сих пор я пришел с пустыми armми. Я также просмотрел список «похожих вопросов», но ничего, что я нашел, похоже, не помогло.

Может ли кто-нибудь помочь мне понять, что я делаю не так?

    Комментарий к 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 чтобы определить, какие зависимости требуются.

    Подробнее о вашей проблеме

    Суть вашей проблемы заключается в том, что вы пытаетесь использовать пакет, созданный с использованием другой версии компилятора GCC, в отличие от того, какие библиотеки времени выполнения фактически доступны в вашей ОС.

    В вашем случае вы используете CentOS 7.x, и вы действительно не можете смешивать RPM в Fedora и CentOS, как это, или, по крайней мере, не должны.

    Если вы посмотрите, какому пакету принадлежит эта общая библиотека:

     $ 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 и попробовать один из более старых RPM-пакетов Fedora на их веб-сайте, чтобы увидеть, был ли он построен с использованием CentOS-версии символов GCC.

    Рекомендации

    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_ 

    Поскольку у вас его нет, вам нужно будет установить пакет, содержащий эти библиотеки.

    Самый простой в установке пакет, который обеспечивает это:

    Anaconda3

    Вы можете скачать его с веб-сайта 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, что в вашем случае доставляет больше хлопот, чем стоит ,

    Спасибо вам обоим – ваши ответы были очень полезны.

    Мне не удалось найти только библиотеку libstdc ++ для установки, поэтому я пошел с установкой Anaconda3. Это помогло мне преодолеть эту конкретную проблему, только чтобы подарить мне еще одну проблему:

    $ trillian trillian: ошибка поиска символа: trillian: неопределенный символ: _ZN4Glib25filename_display_basenameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

    Так что теперь я собираюсь найти решение этой проблемы. Приветствуются любые предложения, и еще раз спасибо вам обоим за помощь в этом!