Linux

Настройка библиотечных путей в Linux: LD_LIBRARY_PATH и ldconfig

Этот гайд подробно объясняет, как управлять путями поиска динамических библиотек в Linux. Вы освоите три основных метода: переменную окружения LD_LIBRARY_PATH, конфигурационные файлы ld.so и утилиту ldconfig, а также научитесь проверять корректность настроек.

Обновлено 16 февраля 2026 г.
10-15 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 20.04+Debian 10+CentOS 7+RHEL 8+Linux в целом

Введение / Зачем это нужно

Динамические библиотеки (файлы .so в Linux) — это ключевой механизм для экономии памяти и упрощения обновлений программ. Однако система должна знать, где искать эти библиотеки. По умолчанию проверяются стандартные каталоги (/lib, /usr/lib и др.), но если вы устанавливаете ПО в нестандартное место (например, /opt/app/lib), нужно явно указать этот путь.

Этот гайд объясняет, как добавить пользовательские каталоги в путь поиска библиотек тремя основными методами. После выполнения вы сможете:

  • Запускать программы, которые используют несистемные библиотеки.
  • Развертывать собственные сборки ПО без конфликтов.
  • Диагностировать ошибки error while loading shared libraries.

Требования / Подготовка

Перед началом убедитесь, что:

  1. У вас есть доступ к терминалу (SSH или локальная консоль).
  2. Для системных изменений (метод 3) потребуются права суперпользователя (sudo).
  3. Вы знаете абсолютный путь к каталогу с библиотеками (например, /home/user/myproject/lib). Относительные пути не работают.
  4. В этом каталоге находятся файлы с расширением .so (или симлинки на них).

Пошаговая инструкция

Шаг 1: Проверка текущих настроек

Прежде чем вносить изменения, посмотрите, какие пути уже настроены.

# 1. Проверка переменной LD_LIBRARY_PATH (если пуста — вывод будет пустым)
echo "Текущий LD_LIBRARY_PATH: $LD_LIBRARY_PATH"

# 2. Просмотр системных путей из конфигурации ld.so
# -v: подробный вывод, 2>/dev/null: подавляем предупреждения о 32-битных библиотеках
ldconfig -v 2>/dev/null | grep -v '^\s' | head -20

Что вы увидите:
Первая команда покажет пользовательские пути (если были установлены). Вторая — все каталоги, которые система знает после последнего запуска ldconfig. Это стандартные пути (/lib, /usr/lib) и пути из файлов в /etc/ld.so.conf.d/.

Шаг 2: Временное добавление пути (для текущей сессии)

Этот метод подходит для быстрой проверки или разового запуска программы. Путь действует только в текущем окне терминала.

# Замените /путь/к/библиотекам на ваш реальный путь
export LD_LIBRARY_PATH="/путь/к/библиотекам:$LD_LIBRARY_PATH"

# Проверьте, что переменная установилась
echo $LD_LIBRARY_PATH

Важно:

  • :$LD_LIBRARY_PATH в конце добавляет новый путь в начало списка, что даёт ему приоритет.
  • После закрытия терминала настройка сбросится.

Шаг 3: Постоянное добавление пути для текущего пользователя

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

# 1. Откройте файл ~/.bashrc (для bash) или ~/.zshrc (для zsh) в редакторе
nano ~/.bashrc

# 2. В конец файла добавьте строку (замените путь):
export LD_LIBRARY_PATH="/opt/mylibs:$LD_LIBRARY_PATH"

# 3. Сохраните (Ctrl+O, Enter) и закройте (Ctrl+X)

# 4. Примените изменения к текущей сессии
source ~/.bashrc

# 5. Проверьте
echo $LD_LIBRARY_PATH

Примечание:
Этот метод влияет только на вашего пользователя и только при запуске интерактивных оболочек. Для GUI-приложений может потребоваться добавление в ~/.profile или ~/.xprofile.

Шаг 4: Добавление системного пути (для всех пользователей)

Это рекомендуемый способ для библиотек, которые должны быть доступны всем программам и пользователям. Он более стабилен и не зависит от переменных окружения.

# 1. Создайте новый конфигурационный файл в /etc/ld.so.conf.d/
sudo nano /etc/ld.so.conf.d/custom.conf

# 2. Впишите абсолютный путь к каталогу с библиотеками (одна строка на путь):
/usr/local/lib/mylibs

# 3. Сохраните и закройте редактор.

# 4. Обновите кэш ld.so (это обязательно!)
sudo ldconfig

# 5. Проверьте, что путь добавился:
ldconfig -v 2>/dev/null | grep mylibs

Почему это лучше:

  • Не требует настройки переменных окружения для каждого пользователя.
  • Работает для всех программ, включая сервисы systemd и GUI-приложения.
  • Является стандартом для дистрибутивов (пакеты .deb и .rpm добавляют свои файлы в /etc/ld.so.conf.d/).

Шаг 5: Проверка корректности настройки

После любого из методов выше проверьте, что система видит ваши библиотеки.

# Способ 1: Используйте ldd для конкретного исполняемого файла
# Замените /usr/bin/ваша_программа на реальный путь
ldd /usr/bin/ваша_программа | grep "не найдена"

# Если вывод пуст — все библиотеки найдены.
# Если есть строки с "не найдена", значит, путь не настроен.

# Способ 2: Запустите программу, которая ранее падала.
# Она должна теперь работать.

# Способ 3: Проверьте кэш ldconfig
ldconfig -p | grep имя_библиотеки
# Например: ldconfig -p | grep libcustom.so

Возможные проблемы

Проблема: "Permission denied" при использовании sudo ldconfig

Причина: Вы пытаетесь записать в /etc/ld.so.conf.d/ без прав суперпользователя.
Решение: Все операции с системными файлами (/etc/ld.so.conf.d/, /etc/ld.so.conf) требуют sudo.

Проблема: Библиотека по-прежнему не находится после настройки

Причина 1: Указан относительный путь (например, ./lib).
Решение: Всегда используйте абсолютный путь (/home/user/project/lib).

Причина 2: Файл библиотеки имеет неправильные права.
Решение: Убедитесь, что у файла .so есть права на чтение для всех:

ls -l /путь/к/библиотеке/libexample.so
# Должно быть: -rwxr-xr-x или хотя бы -rw-r--r--
sudo chmod 755 /путь/к/библиотеке/libexample.so

Причина 3: Вы добавили путь в LD_LIBRARY_PATH, но переменная не экспортирована.
Решение: Проверьте export | grep LD_LIBRARY_PATH. Если вывод пуст, добавьте export в конфигурационный файл.

Причина 4: Путь добавлен в /etc/ld.so.conf.d/, но ldconfig не был выполнен.
Решение: Всегда запускайте sudo ldconfig после редактирования файлов в /etc/ld.so.conf.d/.

Проблема: Конфликт библиотек (программа ломается после добавления пути)

Причина: В вашем каталоге есть библиотека с тем же именем, что и в системе, но другой версии.
Решение:

  1. Проверьте, какая библиотека загружается: ldd /путь/к/программе | grep конфликтующая_библиотека.
  2. Если загружается ваша, а не системная — это проблема. Переименуйте вашу библиотеку или используйте изоляцию через patchelf или chrpath для изменения RPATH исполняемого файла.
  3. Временное решение: удалите путь из LD_LIBRARY_PATH или переместите библиотеку в другой каталог.

Проблема: Настройки не применяются для GUI-приложений

Причина: Графические оболочки (GNOME, KDE) не всегда читают ~/.bashrc.
Решение: Для постоянных путей используйте метод 4 (системный через ld.so.conf.d). Если нужно только для пользователя, добавьте export LD_LIBRARY_PATH=... в ~/.profile или ~/.xprofile.

# Пример для ~/.profile
if [ -z "$LD_LIBRARY_PATH" ]; then
    export LD_LIBRARY_PATH="/home/user/myapp/lib"
else
    export LD_LIBRARY_PATH="/home/user/myapp/lib:$LD_LIBRARY_PATH"
fi

Часто задаваемые вопросы

Что такое LD_LIBRARY_PATH и зачем он нужен?
Как сделать изменения в LD_LIBRARY_PATH постоянными?
Когда лучше использовать /etc/ld.so.conf вместо LD_LIBRARY_PATH?
Почему после добавления пути в LD_LIBRARY_PATH библиотека всё равно не находится?

Полезное

Проверка текущих библиотечных путей
Временное добавление пути через LD_LIBRARY_PATH
Постоянное добавление пути для пользователя
Добавление системного пути через ld.so.conf
Проверка работы настройки