Что означает ошибка «cannot open shared object file»
Ошибка с текстом error while loading shared libraries: <имя_библиотеки>.so: cannot open shared object file: No such file or directory (или её варианты, такие как ld-linux.so not found) — это критическое сообщение от динамического загрузчика Linux (ld-linux.so или ld.so).
Она означает, что система не смогла найти необходимую общую (shared) библиотеку (файл с расширением .so) во время попытки запуска исполняемого файла (программы, утилиты, другого бинарника). Динамический загрузчик отвечает за разрешение зависимостей программы от внешних библиотек. Если нужный файл не обнаружен в заданных путях, запуск прерывается.
Полный текст типичной ошибки:
./myapp: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
Здесь libssl.so.1.1 — отсутствующая библиотека.
Причины возникновения
- Библиотека не установлена. Самая частая причина. Программа требует конкретную версию библиотеки (например,
libssl.so.1.1), которая отсутствует в системе. - Библиотека установлена, но в нестандартном пути. Загрузчик ищет библиотеки только в путях, указанных в
/etc/ld.so.confи файлах в/etc/ld.so.conf.d/, а также в стандартных (/lib,/usr/lib). Если библиотека лежит, например, в/opt/custom/lib, она не будет найдена. - Устарел кэш загрузчика (
/etc/ld.so.cache). Даже если библиотека лежит в правильном месте, загрузчик использует скомпилированный кэш. После установки новой библиотеки кэш нужно обновить командойldconfig. - Конфликт/повреждение пакета. Библиотека могла быть удалена или повреждена при обновлении/удалении другого пакета.
- Несовместимость архитектуры или версии glibc. Попытка запустить 32-битную программу на чисто 64-битной системе без установки 32-битных библиотек (
:i386пакеты в Debian/Ubuntu). Или программа скомпилирована под очень старую/новую версию библиотеки, которой нет в текущем релизе дистрибутива. - Повреждённые символические ссылки. В папке с библиотеками могут быть битые ссылки
libssl.so -> libssl.so.1.1, указывающие на несуществующий файл.
Способы решения
Способ 1: Обновление кэша загрузчика (самое простое и частое)
Это первый и обязательный шаг после установки любой новой библиотеки.
- Откройте терминал.
- Выполните команду с правами суперпользователя:
sudo ldconfig - Попробуйте запустить программу снова.
Что делает ldconfig: Он сканирует все каталоги, перечисленные в конфигурационных файлах /etc/ld.so.conf и /etc/ld.so.conf.d/*.conf, находит там библиотеки (файлы lib*.so*), обновляет (или создаёт) кэш /etc/ld.so.cache и обновляет символические ссылки. После этого загрузчик знает, где искать все установленные библиотеки.
💡 Совет: Если вы только что установили пакет через менеджер пакетов (
apt,dnf), он обычно сам вызываетldconfig. Но если вы вручную скопировали.soфайл в/usr/local/lib—ldconfigвыполнить обязательно.
Способ 2: Установка недостающего пакета
Если библиотеки физически нет в системе, её нужно установить.
Для Debian/Ubuntu и производных:
- Найдите имя пакета, который предоставляет нужную библиотеку. Самый точный способ:
apt-file search libssl.so.1.1 | head -n 5
Еслиapt-fileне установлен, сначала выполнитеsudo apt update && sudo apt install apt-file && sudo apt-file update. - Установите пакет (пример для
libssl.so.1.1):sudo apt update sudo apt install libssl1.1
Или, если требуется более новая версия:sudo apt install libssl3 - Обновите кэш:
sudo ldconfig.
Для CentOS/RHEL/Fedora/Rocky/AlmaLinux:
- Найдите пакет:
yum provides "*/libssl.so.1.1" # или для dnf dnf provides "*/libssl.so.1.1" - Установите найденный пакет (например,
openssl-libs):sudo dnf install openssl-libs - Обновите кэш:
sudo ldconfig.
Способ 3: Добавление нестандартного пути в конфигурацию ld.so
Если библиотека лежит в кастомной папке (например, вы скомпилировали и установили программу в /opt/myapp/lib).
- Создайте новый конфигурационный файл (рекомендуется) или отредактируйте существующий:
sudo nano /etc/ld.so.conf.d/custom-apps.conf
Добавьте в файл одну строку с полным путём к папке, содержащей.soфайлы:/opt/myapp/lib
Можно добавить несколько путей, каждый с новой строки. - Примените изменения:
sudo ldconfig - Проверьте, что путь добавился в кэш:
ldconfig -p | grep myapp
⚠️ Важно: Не добавляйте в
/etc/ld.so.confпути к временным или недоверенным каталогам. Это вопрос безопасности.
Способ 4: Использование переменной окружения LD_LIBRARY_PATH (временное решение)
Этот метод имеет наивысший приоритет для загрузчика, но считается временным и менее безопасным, так как может привести к загрузке не тех библиотек.
- Установите переменную окружения перед запуском команды:
LD_LIBRARY_PATH="/путь/к/папке_с_библиотеками:$LD_LIBRARY_PATH" ./ваша_программа
Пример:LD_LIBRARY_PATH="/home/user/app/lib:$LD_LIBRARY_PATH" ./myapp - Для постоянного использования (только для текущего пользователя) добавьте строку в
~/.bashrcили~/.profile:export LD_LIBRARY_PATH="/home/user/app/lib:$LD_LIBRARY_PATH"
После этого выполнитеsource ~/.bashrcили перезайдите в систему.
⚠️ Предупреждение: Избегайте глобального (системного) использования
LD_LIBRARY_PATHв/etc/profile. Это может сломать системные утилиты. Используйте только для конкретных приложений или в пользовательских скриптах.
Способ 5: Переустановка или настройка RPATH конкретного бинарника (продвинутый)
Если вы разрабатываете или управляете конкретным приложением, можно зашить путь к библиотекам прямо в бинарник с помощью утилиты patchelf.
- Установите
patchelf:# Debian/Ubuntu sudo apt install patchelf # CentOS/RHEL/Fedora sudo dnf install patchelf - Проверьте текущий
RPATH(встроенный путь поиска библиотек) бинарника:patchelf --print-rpath ./ваша_программа - Установите нужный
RPATH(например,$ORIGIN/libдля поиска в папкеlibрядом с бинарником):patchelf --set-rpath '$ORIGIN/lib' ./ваша_программа - Теперь бинарник будет искать библиотеки в указанном относительном пути, независимо от системных настроек.
Профилактика
- Устанавливайте пакеты только из официальных репозиториев вашего дистрибутива. Это гарантирует совместимость библиотек.
- Не удаляйте системные библиотеки вручную. Всегда используйте менеджер пакетов (
apt remove,dnf remove). - После ручной установки ПО (из исходников, в
/usr/local) всегда выполняйтеsudo ldconfig, если установщик не сделал это сам. - Используйте изолированные среды (например,
conda,virtualenvдля Python,dockerконтейнеры,flatpak,snap) для приложений с нестандартными зависимостями. Это не даст им конфликтовать с системными библиотеками. - При компиляции из исходников используйте флаги
./configure --prefix=/usr/local(или другой чистый путь) и затемmake install. Стандартные пути (/usr/local/lib) уже учтены вld.so.conf.d. - Периодически обновляйте систему (
sudo apt update && sudo apt upgrade,sudo dnf upgrade), чтобы получать актуальные и совместимые версии библиотек.