Майнинг,  Статьи

О решении проблем с загрузкой общих библиотек в Linux

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

Особенно часто это слуачется при запуске приложений, связанных с выполнением многопотоковых CUDA-вычислений.

Например, при запуске ccminer иногда возникает ошибка:

./ccminer-xaya/ccminer: error while loading shared libraries: libcudart.so.10.2: cannot open shared object file: No such file or directory

после которой программа закрывается.

Похожая неприятность при запуске cryptodredge:

./CryptoDredge: error while loading shared libraries: libnvrtc.so.11.2: cannot open shared object file: No such file or directory

Аналогичная ситуация при попытке открыть программу TeamBlackMiner:

./TBMiner: error while loading shared libraries: libnvrtc.so.11.2: cannot open shared object file: No such file or directory

Подобные досадные ошибки обычно возникают при запуске программы, скомпилированной для работы в операционной системе с другим ядром/набором системных пакетов/утилит. Решить проблему не помогает даже установка последней версии драйвера Nvidia со всеми необходимыми библиотеками.

Иногда проблема не решается даже после компиляции программы из исходного кода, скачанного с Github или подобных ресурсов.

В данной статье рассматриваются практические способы решения проблемы с ошибкой error while loading shared libraries на примере операционной системы xubuntu 22.04. Нижеприведенный текст отражает субъективное мнение автора, выработанное методом проб и ошибок.

Как заставить работать программу, не находящую необходимой библиотеки?

Прооблему нахождения системой нужной библиотеки можно решить разными способами, среди которых:

  • указать перед запуском программы путь, по которому находится нужная shared library командой export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:полный путь к нужному каталогу. Этот способ подходит в том случае, если нужный пакет установлен в системе, но программа из вредности не хочет видеть нужный файл;
  • создать символьную ссылку (типа Windows-ярлыка) на нужный файл командой ln. Этот случай подходит для решения проблем, описанных выше, а также в тех случаях, когда точной версии искомого файла в системе нет, но имеется другой, более новый, например, libcudart.so.12 вместо libcudart.so.10.2.

Как прописать путь к файлу общей библиотеки в ubuntu?

Чтобы устранить ошибку, возникающую при невозможности найти нужную библиотеку при запуске программ в Linux, нужно установить необходимые пакеты. Если они инсталлированы в системе, но программа по прежнему не видит нужной библиотеки, то необходимо вручную прописать к ним путь в скрипте запуска программы. Для этого нужно знать точный путь к каталогу, в котором находится неуловимый файл.

Для поиска файла в Linux можно воспользоваться командой locate.

Выполнив команду locate в системе xubuntu 22.04 c CUDA Toolkit 10.2

locate libcudart.so.10.2

получаем вывод:

/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudart.so.10.2
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudart.so.10.2.89

Также можно использовать команду «Фас!» find

sudo find / -name 'libcudart.so.10.2'
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudart.so.10.2

Исходя из полученных сведений, в начале скрипта запуска непослушной программы добавляем строку:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH://usr/local/cuda-10.2/targets/x86_64-linux/lib/

Пример скрипта запуска ccminer с точно указанным путем к библиотеке libcudart.so.10.2, по которому отображаются пригодные для майнинга видеокарты:

#!/bin/sh
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH://usr/local/cuda-10.2/targets/x86_64-linux/lib/
./ccminer -n
sleep 100

Для решения проблемы с поиском файла libcudart.so.10.2 можно также использовать символьную ссылку. После ее создания любая программа, которой необходим этот файл запуститься без проблем, даже без извращений манипуляций с export LD_LIBRARY_PATH.

Как использовать символьные ссылки для решения проблем при запуске программ в Linux?

Для использования программой файла другой версии, например, libcudart.so.12 вместо libcudart.so.10.2, либо для точного указания местонахождения какого-либо файла, можно создать соответствующую символьную ссылку (аналог ярлыка в Windows).

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

Например, чтобы создать ссылку на файл libcudart.so.12 (каталог /usr/local/cuda-12.0/targets/x86_64-linux/lib/), который будет работать под личиной libcudart.so.10.2, используют команды:

cd /usr/local/cuda-12.0/targets/x86_64-linux/lib/
sudo ln -sf libcudart.so.10.2 libcudart.so.12

В результате этого в каталоге /usr/local/cuda-12.0/targets/x86_64-linux/lib/ появится файл-символьная ссылка, переправляющего ищущего libcudart.so.10.2 на файл libcudart.so.12.

Теперь программа, которой необходим libcudart.so.10.2 автоматически будет использовать файл libcudart.so.12.

Аналогичным образом можно указать недальновидной программе, где находится другой, нужный ей файл. Например, в системе при запуске программы CryptoDredge 0.27.0 возникает ошибка:

error while loading shared libraries: libnvrtc.so.11.2: cannot open shared object file: No such file or directory

Для решения проблемы в каталоге /usr/local/cuda/targets/x86_64-linux/lib/

создаем символьную ссылку на файл libnvrtc.so.11.2, находящийся в каталоге майнера (путь /home/intel39/Miners/CryptoDredge_0.27/).

cd /usr/local/cuda/targets/x86_64-linux/lib/
sudo ln -sf /home/intel39/Miners/CryptoDredge_0.27/libnvrtc.so.11.2 libnvrtc.so.11.2

Теперь программа CryptoDredge_0.27 запускается без проблем.

Просмотреть символьные ссылки в нужном каталоге можно командой ls -l, например:

cd /usr/local/cuda/targets/x86_64-linux/lib/
ls -l /usr/local/cuda/targets/x86_64-linux/lib/
total 2043508
lrwxrwxrwx 1 root root 19 лют 14 14:38 libaccinj64.so -> libaccinj64.so.10.2
...
-rwxr-xr-x 1 root root 22039608 лют 14 14:39 libnvrtc.so.10.2.89
lrwxrwxrwx 1 root root 55 лют 20 01:10 libnvrtc.so.11.2 -> /home/intel39/Miners/CryptoDredge_0.27/libnvrtc.so.11.2
...
-rwxr-xr-x 1 root root 27096 лют 14 14:39 libOpenCL.so.1.1
drwxr-xr-x 2 root root 4096 лют 14 14:41 stubs

Красным цветом при отображении по команде ls -l показываются битые, нерабочие ссылки.

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

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