Статьи

Об устранении ошибки ‘GLIBCXX_any version’ not found

Без труда не выловишь и рыбку из пруда...
Народная мудрость

Иногда при запуске программ в Linux происходит сбой, при котором появляется сообщение об ошибке, связанное с отсутствием или невозможностью найти какую-либо библиотеку/файл.

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

/cpuminer: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.32' not found (required by ./cpuminer)

Почему появляется ошибка libstdc++.so.6: version `GLIBCXX_x.x.x’ not found (required by …)?

Проблема, связанная с невозможностью найти разделяемую библиотеку libstdc++.so.6 с нужной версией GLIBCXX связана с особенностями работы компилятора gcc, в соответствии с которыми он формирует динамические связи в исполняемых файлах.

GCC при компиляции программы вносит в ее исполняемый файл код, согласно которому при ее работе должна использоваться библиотека libstdc++.so.6 подходящей версии, в рассматриваемом случае (для компилятора GCC 13.2.0) — файл GLIBCXX 3.4.32 или новее.

Для справки: установить библиотеку libstdc++.so.6 в Linux можно командой

sudo apt install libstdc++6 -y

Библиотека libstdc++.so.6 помогает трансформировать исходный код программы, написанный на языке программирования C++ в машинный язык, который исполняется процессором, выполняя следуюшие задачи:

  • реализация стандартной библиотеки C++ согласно стандартам ISO;
  • работа с базовыми функциями, такими, как операции ввода/вывода, работа со станлартными классами и функциями;
  • динамическое связывание программы с актуальной версией libstdc++.so.6;
  • оптимизация структуры данных и алгоритмов.

libstdc++.so.6 и компилятор регулярно обновляются, что находит отражение в программном обеспечении, для работы которого в операционной системе требуется наличие обновленных служебных компонентов. Если используется нестандартная (самая новая) версия компилятора (например, gcc 13.2.0 в ubuntu 22.04, 20.04, 18.04 и т.д.), то при сборке программы может возникнуть ситуация, при которой для ее запуска понадобиться версия libstdc++.so.6,отличающаяся от той, которая установлена в системе согласно стандартной процедуре.

Таким образом, для решения проблемы нужно либо установить требуемую версию libstdc++.so.6 (более новую), либо заставить программу использовать имеющийся релиз (этот способ подойдет, если программа собирается и запускается в одной и той же системе).

Посмотреть все версии ibstdc++.so.6 (файлов GLIBCXX), установленные в операционной системе, можно командой:

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

Например, на компьютере под управлением xubuntu 22.04 со стандартными обновлениями и установленным вручную компилятором gcc 13.2.0 имеются версии GLIBCXX начиная с 3.4, 3.4.1 и так далее — до GLIBCXX_3.4.30:

GLIBCXX_3.4
GLIBCXX_3.4.1
...
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_3.4.30
GLIBCXX_DEBUG_MESSAGE_LENGTH

Обновление системы командами

sudo apt update && sudo apt -y upgrade && sudo apt -y dist-upgrade && sudo apt -y autoremove && sudo apt-get clean

проблему не решает, так как GLIBCXX 3.4.32 в момент обновления относится к тестирующимся библиотекам и не входит в стандартный набор компонентов системы.

Если программа запускается на том же компьютере, где производилась сборка исполняемого файла, решить проблему может прописывание в скрипте запуска программы пути к libstdc++.so.6, например:

export LD_LIBRARY_PATH=/usr/local/lib64

Добавление этой строки перед скриптом майнера решает проблему, он запускается без ошибок.

Найти местонахождение библиотеки libstdc++.so.6 можно командой

sudo find / -name "libstdc++.so.6*"

Чтобы кардинально решить проблему и установить недостающую (тестовую) версию GLIBCXX выполняют следующие команды:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install --only-upgrade libstdc++6

В xubuntu 22.04 получаем следующую реакцию:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
PPA publishes dbgsym, you may need to include 'main/debug' component
Repository: 'deb https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu/ jammy main'
Description:
Toolchain test builds; see https://wiki.ubuntu.com/ToolChain
More info: https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test
Adding repository.
Press [ENTER] to continue or Ctrl-c to cancel.

Нажимаем ввод, обновляемся и запускаем установку

sudo apt-get install --only-upgrade libstdc++6
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
gcc-13-base gcc-13-base:i386 libstdc++6:i386
The following NEW packages will be installed:
gcc-13-base gcc-13-base:i386
The following packages will be upgraded:
libstdc++6 libstdc++6:i386
2 upgraded, 2 newly installed, 0 to remove and 27 not upgraded.
Need to get 1 690 kB of archives.
After this operation, 1 146 kB of additional disk space will be used.
Do you want to continue? [Y/n]

Теперь команда

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

показывает наличие нужной версии:

GLIBCXX_3.4
…
GLIBCXX_3.4.32
GLIBCXX_TUNABLES
GLIBCXX_DEBUG_MESSAGE_LENGTH

Поймали…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *