Что означает ошибка library-not-found
Ошибка library-not-found (часто видно как error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory) возникает, когда динамический линковщик Linux (ld.so) не может locate необходимую shared-библиотеку (файл с расширением .so) во время запуска программы.
Типичный сценарий: Вы пытаетесь запустить скомпилированное приложение или скрипт, и вместо выполнения получаете сообщение вида:
./myapp: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
Система нашла исполняемый файл myapp, но для его работы требуется библиотека libssl.so.1.1, которой нет в путях, которые проверяет линковщик.
Причины возникновения
- Отсутствующий пакет с библиотекой. Самая частая причина. Необходимый пакет (например,
libssl-devилиopenssl) не установлен в системе. - Библиотека установлена, но в нестандартном пути. Динамический линковщик по умолчанию ищет библиотеки только в
/lib,/usr/lib,/usr/local/libи их архитектурных поддиректориях (например,/usr/lib/x86_64-linux-gnu). Если библиотека лежит в/opt/libили домашней директории, она не будет найдена. - Несоответствие архитектур. Вы пытаетесь запустить 32-битное приложение, а установлена только 64-битная версия библиотеки (или наоборот).
- Повреждение или неполная установка пакета. Файлы библиотеки могли быть удалены или повреждены.
- Устаревшая версия библиотеки. Приложение требует конкретную версию (например,
libssl.so.1.1), а в системе установлена более новая (libssl.so.3) или, наоборот, более старая. Симлинки могут быть не настроены корректно. - Пропущен шаг
ldconfig. После ручной установки библиотеки в стандартный путь необходимо обновить кэш линковщика.
Способы решения
Способ 1: Установка недостающего пакета через менеджер пакетов (рекомендуемый)
Это самый правильный и системный способ, так как менеджер пакетов сам позаботится о зависимостях, путях и обновлении кэша.
- Определите, какого пакета не хватает. Используйте команду
lddна проблемном исполняемом файле. Она покажет все зависимости и отметит те, которые не найдены.ldd /путь/к/вашему/исполняемому_файлу
Пример вывода:linux-vdso.so.1 (0x00007ffd5b9f8000) libssl.so.1.1 => not found libcrypto.so.1.1 => not found libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8c1a000000) /lib64/ld-linux-x86-64.so.2 (0x00007f8c1a400000)
Здесь не хватает пакетов, предоставляющихlibssl.so.1.1иlibcrypto.so.1.1. - Найдите пакет, содержащий библиотеку. Для Debian/Ubuntu используйте
apt-file. Сначала установите его, если не установлен:sudo apt update && sudo apt install apt-file. Затем обновите базу и ищите:sudo apt-file update apt-file search libssl.so.1.1
Вывод будет содержать строки вида:libssl1.1: /usr/lib/x86_64-linux-gnu/libssl.so.1.1 libssl1.1: /usr/lib/x86_64-linux-gnu/libssl.so.1.1.0
Имя пакета —libssl1.1.
Для RHEL/CentOS/Fedora используйтеyum providesилиdnf provides:yum provides "*/libssl.so.1.1"
Для Arch Linux:pacman -Fy libssl.so.1.1 - Установите найденный пакет.
- Debian/Ubuntu:
sudo apt install libssl1.1 - RHEL/CentOS 7/8:
sudo yum install openssl-libs - Fedora:
sudo dnf install openssl-libs - Arch Linux:
sudo pacman -S openssl
- Debian/Ubuntu:
- Обновите кэш линковщика (обычно делается автоматически при установке пакета, но для верности):
sudo ldconfig - Запустите приложение снова. Ошибка должна исчезнуть.
Способ 2: Ручная установка библиотеки из исходников
Если нужной версии библиотеки нет в репозиториях вашего дистрибутива, можно установить её вручную.
- Скачайте исходный код библиотеки с официального сайта или GitHub (например, для OpenSSL:
https://www.openssl.org/source/). - Распакуйте архив и перейдите в директорию:
tar -xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w - Сконфигурируйте, скомпилируйте и установите. Обычно используется префикс
/usr/local(стандартный путь, который уже в кэшеldconfig). Для 64-битной системы:
Ключ./config --prefix=/usr/local --openssldir=/usr/local/openssl shared make -j$(nproc) sudo make installsharedважен — он собирает shared-библиотеки (.so), а не только статические (.a). - Обновите кэш:
sudo ldconfig - Проверьте наличие файла библиотеки:
ls -l /usr/local/lib/libssl.so.1.1.
Способ 3: Добавление нестандартного пути через LD_LIBRARY_PATH
Если библиотека уже есть в системе, но лежит в нестандартном месте (например, вы установили её в ~/mylibs), можно временно "подсказать" линковщику, где её искать.
- Установите переменную среды
LD_LIBRARY_PATH. Добавьте путь к директории с библиотеками в начало списка:export LD_LIBRARY_PATH=/home/ваш_пользователь/mylibs:$LD_LIBRARY_PATH- Важно: Путь должен указывать на директорию, содержащую
.soфайлы, а не на сам файл. - Эта настройка действует только в текущей оболочке. Для постоянного эффекта добавьте строку в
~/.bashrc,~/.zshrcили~/.profile.
- Важно: Путь должен указывать на директорию, содержащую
- Запустите приложение из той же сессии терминала. Оно теперь сможет найти библиотеки.
- Для отладки можно посмотреть, какие пути проверяются, с помощью
ldd(он теперь учтётLD_LIBRARY_PATH) илиLD_DEBUG=libs ./ваше_приложение.
Способ 4: Создание символических ссылок (symlinks)
Если у вас есть библиотека нужной версии, но с другим именем (например, libssl.so.1.1.0 вместо libssl.so.1.1), создайте symlink.
- Найдите реальный файл библиотеки:
sudo find /usr -name "libssl.so*" 2>/dev/null
Пример вывода:/usr/lib/x86_64-linux-gnu/libssl.so.1.1.0. - Создайте symlink в директории, которая уже в кэше (например,
/usr/lib/x86_64-linux-gnu/):cd /usr/lib/x86_64-linux-gnu sudo ln -s libssl.so.1.1.0 libssl.so.1.1 sudo ln -s libcrypto.so.1.1.0 libcrypto.so.1.1 # если нужно и для неё - Обновите кэш:
sudo ldconfig
Способ 5: Пересборка приложения с правильными путями
Если вы компилируете приложение из исходников самостоятельно, убедитесь, что линковщик знает, где искать библиотеки во время сборки.
- Установите
-dev/-develпакеты. Они содержат заголовочные файлы (.h) и symlinks для компиляции (например,libssl-devдля OpenSSL).sudo apt install libssl-dev # Debian/Ubuntu sudo yum install openssl-devel # RHEL/CentOS - При сборке используйте флаги компилятора. Обычно
pkg-configавтоматически подставляет правильные пути:gcc myapp.c -o myapp $(pkg-config --cflags --libs openssl)
Или укажите явно:gcc myapp.c -o myapp -I/usr/include/openssl -L/usr/lib/x86_64-linux-gnu -lssl -lcrypto-I— путь к заголовкам.-L— путь к библиотекам (во время линковки).-l— имя библиотеки без префиксаlibи расширения.so.
- Собранное приложение будет искать библиотеки в стандартных системных путях, и ошибка
library-not-foundмаловероятна.
Профилактика
- Используйте пакетные менеджеры (
apt,yum,pacman) для установки библиотек. Они гарантируют корректное размещение и учёт зависимостей. - Проверяйте зависимости перед сборкой. Для программ на C/C++ используйте
pkg-config --exists <библиотека>или проверяйте наличие заголовочных файлов (#include <lib.h>). - Документируйте кастомные пути. Если вы устанавливаете библиотеки в нестандартные места (например, в
/opt/), обязательно фиксируйте это и настраивайтеLD_LIBRARY_PATHили добавляйте конфигурационные файлы в/etc/ld.so.conf.d/(после чего требуетсяsudo ldconfig). - Регулярно обновляйте систему:
sudo apt update && sudo apt upgrade. Это помогает избежать конфликтов версий. - Перед запуском стороннего бинарного файла проверяйте его зависимости через
lddи убеждайтесь, что все библиотеки найдены (=> /путь/к/файлувместо=> not found).
💡 Совет: Для постоянного добавления нестандартного пути (например,
/usr/local/lib) в поискld.soсоздайте файл конфигурации:echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/usr-local.conf sudo ldconfigЭто более чистое решение, чем использование
LD_LIBRARY_PATHв глобальной среде.