Программы не находят библиотек для запуска (хотя библиотеки есть)
Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.
Модератор: SLEDopit
13 сообщений • Страница 1 из 1
156 Сообщения: 234 ОС: OPENSUSE ALTLINUX
Программы не находят библиотек для запуска
Сообщение 156 » 15.07.2011 11:33
Запускаю программу, пишет что не находит библиотеу, проверяю наличие библиотеки, она есть, дописываю путь к ней в переменную PATH , проверяю появление пути к библиотеке, проверяю наличие библиотеки, запускаю программу — опять пишет , что нет такой библиотеки. Такое замечено на несколькоих программах, когда не находятся файлы, имеющиеся в наличии в системых каталогах. Прогу запускал под рутом, поэтому проблемы с правами доступа отпадают.
Вопрос — что сделать, чтобы программа увидела нужную ей библиотеку? Лог приводится ниже.
linux-cwod:/home/serg/del # ./unetbootin-linux-549
Исправляем ошибку в KONTAKT No Library found
./unetbootin-linux-549: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory
linux-cwod:/home/serg/del # echo $PATH
/usr/lib64/mpi/gcc/openmpi/bin:/home/serg/bin:/usr/local/bin:/usr/bin:/sbin:/usr/sbin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin
linux-cwod:/home/serg/del # PATH=$PATH:/usr/lib64
linux-cwod:/home/serg/del # echo $PATH
/usr/lib64/mpi/gcc/openmpi/bin:/home/serg/bin:/usr/local/bin:/usr/bin:/sbin:/usr/sbin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin:/usr/lib64
linux-cwod:/home/serg/del # ./unetbootin-linux-549
./unetbootin-linux-549: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory
linux-cwod:/home/serg/del # ls -l /usr/lib64/ | grep libpng
lrwxrwxrwx 1 root root 18 Июл 15 11:17 libpng12.so -> libpng12.so.0.44.0
lrwxrwxrwx 1 root root 18 Июл 14 22:29 libpng12.so.0 -> libpng12.so.0.44.0
-rwxr-xr-x 1 root root 171112 Фев 19 00:25 libpng12.so.0.44.0
lrwxrwxrwx 1 root root 18 Июл 14 22:35 libpng14.so -> libpng14.so.14.4.0
lrwxrwxrwx 1 root root 18 Мар 2 14:43 libpng14.so.14 -> libpng14.so.14.4.0
-rwxr-xr-x 1 root root 170984 Фев 19 00:23 libpng14.so.14.4.0
lrwxrwxrwx 1 root root 11 Июл 14 22:41 libpng.so -> libpng14.so
linux-cwod:/home/serg/del #
Спасибо сказали:
watashiwa_daredeska Бывший модератор Сообщения: 4038 Статус: Искусственный интеллект (pre-alpha) ОС: Debian GNU/Linux
Re: Программы не находят библиотек для запуска
15.07.2011 11:33
проверяю наличие библиотеки, она есть, дописываю путь к ней в переменную PATH
PATH не влияет на поиск библиотек. За библиотеки отвечает LIBRARY_PATH.
15.07.2011 11:33
имеющиеся в наличии в системых каталогах.
Что делать, если Pycharm не видит библиотеку?
Если библиотеки в системных каталогах, то и пути должны быть сообщены системному ld.so, чтобы не мучаться с LIBRARY_PATH каждый раз. Пути (те же самые, что в LIBRARY_PATH) прописываются в /etc/ld.so.conf (или создается файл в /etc/ld.so.conf.d/), потом запускается ldconfig, чтобы обновить кэш библиотек.
Источник: unixforum.org
Как заставить работать программу, не находящую необходимой библиотеки?

Прооблему нахождения системой нужной библиотеки можно решить разными способами, среди которых:
- указать перед запуском программы путь, по которому находится нужная 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).
В этом случае в том месте, где проблемная программа ищет системную библиотеку размещается ярлык символьная ссылка на нужный файл.
Синтаксис, использующийся при создании символьных ссылок:
ln опции файл_источник файл_ссылки
Например, чтобы создать ссылку на файл 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 -s libcudart.so.12 libcudart.so.10.2
В результате этого в каталоге /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 показываются битые, нерабочие ссылки.
Найти нужный аналог можно командой find, например:
sudo find / -name libcrypto.so.*
.
/usr/lib/i386-linux-gnu/libcrypto.so.3
/usr/lib/x86_64-linux-gnu/libcrypto.so.3
из которого видно, что искомая 64-разрядная версия нужного файла – это libcrypto.so.3 каталога /usr/lib/x86_64-linux-gnu/.
- на файл /usr/lib/x86_64-linux-gnu/libssl.so.3 для имитации libssl.so.1.1
sudo ln -s /usr/lib/x86_64-linux-gnu/libssl.so.3 /usr/lib/x86_64-linux-gnu/libssl.so.1.1
- на файл /usr/lib/x86_64-linux-gnu/libssl.so.3 для работы вместо libcrypto.so.1.1
sudo ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.3 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
Такая замена не всегда работает. Иногда все-таки нужно скачивать недостающие (устаревшие) файлы и создать на них символьные ссылки, либо просто помещать в нужный каталог.
Удалить неправильную/ненужную ссылку можно командами unlink или rm, например, для удаления символьной ссылки libcrypto.so.1.1, выполняем команду:
sudo unlink /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
Источник: www.cryptoprofi.info
Ошибка error while loading shared libraries
Новые и опытные пользователи Linux могут сталкиваться с ошибкой error loading shared libraries во время запуска программ, также с ней могут сталкиваться программисты и все желающие компилировать программное обеспечение в своей системе. Эта ошибка в дословном переводе означает что возникла проблема во время загрузки общей библиотеки. О том что такое библиотеки и зачем они нужны вы можете узнать из статьи библиотеки Linux.
В этой же статье мы рассмотрим что значит ошибка error while loading shared libraries более подробно, а главное, как ее решить.
Что означает error while loading shared libraries?

Даже если вы не компилируете свои программы, то вы можете увидеть ошибку error while loading shared libraries: имя_библиотеки: cannot open shared object file: No such file or directory достаточно часто во время установки новых программ не через пакетный менеджер или программ, предназначенных для другого дистрибутива. Как я уже говорил, она возникает потому, что система не может найти библиотеку.
А вот почему ее нельзя найти и загрузить, это уже интересно. Этому может быть несколько причин:
- Библиотека не установлена в системе;
- Библиотека установлена, но неизвестно куда;
- Библиотека установлена правильно, но имеет не ту версию.
При решении проблемы мы будем руководствоваться именно этими причинами и пытаться их решить.
Как исправить ошибку?
1. Библиотека не установлена
Первый вариант, тут все понятно, библиотеки просто нет в системе, поэтому мы и получаем такую ошибку. Верный способ ее решения — просто найти пакет библиотеки с помощью пакетного менеджера и установить ее. Обычно, пакеты с библиотеками называются так же, как и сами библиотеки с префиксом lib.
Например, если нам не хватает библиотеки libfuse2.so, то мы можем найти ее в Ubuntu такой командой:
sudo apt search libfuse2

Затем осталось только установить ее:
sudo apt install libfuse2
Если перед вами стоит задача собрать программу из исходников, то вам понадобится не только установить саму библиотеку, но и заголовочные файлы для нее:
sudo apt install libfuse-dev
И так для любой библиотеки. Но это не всегда помогает.
2. Библиотека находится не в том каталоге
Бывает что библиотека установлена, мы установили ее или она поставлялась вместе с программой, но ошибка как была, так и есть. Причиной этому может быть то, что загрузчик Linux не может найти библиотеку.
Поиск библиотек выполняется по всех папках, которые указаны в конфигурационных файлах /etc/ld.conf.d/. По умолчанию, это такие каталоги, как /usr/lib, /lib, /usr/lib64, /lib64. Если библиотека установлена в другой каталог, то, возможно, это и есть причина проблемы.
Вы можете посмотреть какие библиотеки сейчас доступны загрузчику с помощью команды:

Найти, где находится ваша библиотека можно с помощью команды locate. Например, нас интересует библиотека librtfreader.so:

Теперь мы знаем, что она находится по адресу /opt/kingsoft/wps-office/office6/. А значит, для работы программы необходимо сделать чтобы загрузчик библиотек ее видел. Для этого можно добавить путь в один из файлов /etc/ld.so.conf.d/ или же в переменную LD_LIBRARY_PATH:
Опять же, так вы можете поставить с любой библиотекой, которая взывает ошибку. Еще один более простой метод — это просто создать символическую ссылку на нужную библиотеку в правильной папке:
ln -s /opt/kingsoft/wps-office/office6/librtfreader.so /usr/lib/librtfreader.so
3. Неверная версия библиотеки
Эта причина ошибки довольно часто встречается при использовании программ не для вашего дистрибутива. Каждая библиотека имеет дополнительную версию, так называемую ревизию, которая записывается после расширения .so. Например, libav.so.1. Так вот, номер версии меняется всякий раз, когда в библиотеку вносятся какие-либо исправления.
Часто возникает ситуация, когда в одном дистрибутиве программа собирается с зависимостью от библиотеки, например, libc.so.1, а в другом есть только libc.so.2. Отличия в большинстве случаев здесь небольшие и программа могла бы работать на второй версии библиотеки. Поэтому мы можем просто создать символическую ссылку на нее.
Например, библиотеки libusb-1.0.so.1 нет. Но зато есть libusb-1.0.so.0.1, и мы можем ее использовать:

Для этого просто создаем символическую ссылку на библиотеку:
sudo ln -s /usr/lib/libusb-1.0.so.0.1 /usr/lib/libusb-1.0.so.1
В большинстве случаев программа не заметит подмены и будет работать, как и ожидалось. Также для решения этой проблемы можно попытаться найти нужную версию библиотеки в интернете для своей архитектуры и поместить ее в папку /usr/lib/ или /usr/lib64/. Но после этого желательно обновить кэш:

Выводы
В этой статье мы рассмотрели почему возникает ошибка Error while loading shared libraries, а также как ее решить. В большинстве случаев проблема решается довольно просто и вы получите работоспособную программу. Надеюсь, эта информация была полезной для вас.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Источник: losst.pro