Linux export ld library path

Linux export ld library path

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

Это сообщение выдает загрузчик динамических библиотек(динамический линковщик — dynamic linker), который в нашем случае не может обнаружить библиотеку libfsdyn.so. Для настройки динамического линковщика существует ряд программ.

Первая программа называется ldd. Она выдает на экран список динамических библиотек используемых в программе и их местоположение. В качестве параметра ей сообщается название обследуемой программы. Давайте попробуем использовать ее для нашей программы rezultdyn:

Как видите все правильно. Программа использует три библиотеки:

  • libc.so.6 — стандартную библиотеку функций языка C++.
  • ld-linux.so.2 — библиотеку динамической линковки программ ELF формата.
  • libfsdyn.so — нашу динамическую библиотеку функций.

Нашу библиотеку она найти не может. И правильно! Динамический линковщик ищет библиотеки только в известных ему каталогах, а каталог нашей программы ему явно не известен.

Для того, чтобы добавить нашу директорию с библиотекой в список известных директорий надо подредактировать файл /etc/ld.so.conf. Например, у меня этот файл состоит из таких строк:

Во всех этих директории хранятся всеми используемые библиотеки. В этом списке нет лишь одной директории — /lib, которая сама по себе не нуждается в описании, так как она является главной. Получается, что наша библиотека станет «заметной», если поместить ее в один их этих каталогов, либо отдельно описать в отдельном каталоге. Давайте для теста опишем, добавим строку в конец файла ld.so.conf:

У меня этот файл валяется в домашнем каталога пользователя root, у Вас он может быть в другом месте. Теперь после этого динамический линковщик будет знать где можно найти наш файл, но после изменения конфигурационного файла ld.so.conf необходимо, чтобы система перечитала настройки заново. Это делает программа ldconfig. Пробуем запустить нашу программу:

Как видите все заработало 🙂 Если теперь Вы удалите добавленную нами строку и снова запустите ldconfig, то данные о расположении нашей библиотеки исчезнут и будет появляться таже самая ошибка.

Но описанный метод влияет на всю систему в целом и требует доступа администратора системы, т.е. root. А если Вы простой пользователь без сверх возможностей ?!

Для такого случая есть другое безболезненное решение. Это использование специальной переменной среды LD_LIBRARY_PATH, в которой перечисляются все каталоги содержащие пользовательские динамические библиотеки. Для того, чтобы установить эту переменную в командной среде bash надо набрать всего несколько команд. Для начала посмотрим есть ли у нас такая переменная среды:

У меня в ответ выводится пустая строка, означающая, что такой переменной среды нет. Устанавливается она следующим образом:

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

Если Вы обнулите эту переменную, то снова библиотека перестанет работать:

Читайте также:  Open windows search results

Вы также параллельно можете зайти в систему под другим пользователем или даже тем же самым, но если Вы захотите просмотреть значение LD_LIBRARY_PATH, то увидите ее прежнее значение. Это означает, что два разных пользователя Linux не могут влиять на работу друг друга, а это и есть самое главное хорошее отличие систем Unix от большинства других систем.

Источник

Как правильно использовать LD_LIBRARY_PATH?

Решил на выходных повтыкать в одну игру с gog, а там в start.sh есть такой кусок:

просто у тебя есть эти нужные библиотеки, а в указанной директории нет

То есть, если задана эта переменная, то системные папки не проверяются?

Похоже, что LD_LIBRARY_PATH уже содержит какие-то пути, в т.ч. к libGL.so.1, но этот скрипт вместо того, чтобы добавить к ним свои, затирает их.

васче это странно. как их можно затереть?

Очень просто, в переменной лежало одно значение, а export в скрипте положил новое вместо старого. Правильно было бы добавить в начало:

никогда так не делал и всё работало. просто, скорее всего, там и ./$bin_name тоже какой-то скрипт.

просто у тебя есть эти нужные библиотеки, а в указанной директории нет

Наоборот. В указанной директории есть какие-то библиотеки, с которыми игра не работает.

скорее всего, так.

Это же очень легко выяснить. Если ОП напишет в консоли echo $LD_LIBRARY_PATH , и там не пусто, и в одном из этих каталогов есть libGL.so.1, то игра не нашла libGL из-за того, что скрипт изменил значение LD_LIBRARY_PATH, стерев те пути, которые там были.

Запускается игра и при отсутствии export LD_LIBRARY_PATH в скрипте, скорее всего, из-за того, что нужные библиотеки (которые лежали в game и lib) есть и в системных каталогах.

На правах мэйнтэйнера: чем не устроил games-strategy/spaz ?

Или там версия старая?

Update: пардон, почудилось что ты задавал вопрос про humble bundle версию, а не про gog.

В том-то и дело что в LD_LIBRARY_PATH пусто по-умолчанию.

Источник

ИТ База знаний

Курс по Asterisk

Полезно

— Узнать IP — адрес компьютера в интернете

— Онлайн генератор устойчивых паролей

— Онлайн калькулятор подсетей

— Калькулятор инсталляции IP — АТС Asterisk

— Руководство администратора FreePBX на русском языке

— Руководство администратора Cisco UCM/CME на русском языке

— Руководство администратора по Linux/Unix

Серверные решения

Телефония

FreePBX и Asterisk

Настройка программных телефонов

Корпоративные сети

Протоколы и стандарты

Управление библиотеками в Linux

Когда библиотекарь — пингвин

4 минуты чтения

В данной статье мы посмотрим, что такое статические и динамические библиотеки. Местоположение библиотек по умолчанию. Определение используемых библиотек. Загрузка библиотек.

Мини — курс по виртуализации

Знакомство с VMware vSphere 7 и технологией виртуализации в авторском мини — курсе от Михаила Якобсена

Библиотеки это набор функций, которые могут использоваться в различных программах. Библиотеки могут быть статические (библиотека привязывается к определенной программе или софт содержит данную библиотеку в своем теле.) и динамическими (библиотеки грузятся в оперативную память и используются). Плюсы первого варианта нет проблемы совместимости, т. к. софт уже в себе содержит библиотеку, библиотека всегда с собой. Но при этом программы становятся большие по размеры и т.к каждая может загружать свои библиотеки, а иногда и одинаковые. Второй вариант значительно лучше, сами программы по своему размеру меньше. Библиотека загружается один раз в оперативку. И следующая программа, которой необходимы такие же функции, берет и использует эти данные.

Читайте также:  Как удалить историю подключения usb устройств windows

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

И есть вторая папка /usr/lib. В ней находятся библиотеки, которые используют программы расположенные /usr/bin. Пути к библиотекам указаны файле /etc/ld.so.conf. Данный файл можно просмотреть стандартным способом, через утилиту cat.

Видим, что написано включить все библиотеки, которые расположены по пути, указанном в файле. Те которые оканчиваются на .conf. Он просто включает в себя все настройки, которые находятся в конфигурационных файлах, в данной директории. Переходим в данную директорию.

В данной директории мы можем видеть 2 файла конфигурации, в зависимости от версии и наполнения операционной системы их может быть и больше. Ну и соответственно в конфигурационных файлах находятся пути к директориям, где лежат необходимые для работы библиотеки. Если мы ставим какое, то свое программное обеспечение, которому необходимы дополнительные библиотеки, не идущие в составе дистрибутива linux, то в данной директории может создаться свой конфигурационный файл. Например: если мы используем систему виртуализации VMware, то к каждой VM устанавливаем VMware tools то данное программное обеспечение создаст свой конфигурационный файл с путями для своих библиотек.

Переходим в директорию cd /etc/ и отсортируем так, чтобы в результатах все, что содержит ld.

Видим 3 основных конфигурационных файла. ld.so.conf — это файл конфигурации в котором написано откуда брать дополнительные библиотеки. Директория ls.so.conf.d в которой находятся дополнительные конфигурационные файлы и ld.so.cache это кэш библиотек. Он у нас выстраивается каждый раз для того, чтобы программы при необходимости при запросе библиотек не копались в файлах, а сразу брали из загруженного в оперативную память кэша. Т.е. если мы вносим какие-то изменения в файл конфигурации, добавляем какие-то конфигурационные файлы нам необходимо обновить этот кэш. Кэш обновляется командой ldconfig. Этого, собственно, достаточно, чтобы прогрузить все библиотеки в кэш.

Давайте посмотрим, как, определить какими библиотеками пользуется какая программа.

Для этого мы будем использовать команду ldd и путь к бинарному файлу. Например: Программа ls которая используется для вывода списка файлов в каталоге. Она находится в каталоге /bin/ls.

В результате получим мы следующее:

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

Возможно добавление библиотек вручную, это может потребоваться если мы ставим совершенно стороннее программное обеспечение, которое очень трудно взаимодействует с Linux или устаревшее. Т.е. которое само не может создать конфигурационный файл и разнести библиотеки в системные директории Linux. Если мы хотим сделать это вручную, тогда нам необходим тот самый файл /etc/ld.so.conf. В данный файл мы можем дописать путь к файлу конфигурации библиотек тех, которые нам нужны. Либо есть более легкий вариант с использованием переменной export LD_LIBRARY_PATH и указать путь к тем особенным библиотекам, которые будет использовать наша «особенная» программа. Обычно все стороннее программное обеспечение устанавливается в папку /opt. Итоговый вариант будет выглядеть как: export LD_LIBRARY_PATH=/opt/soft/lib и когда пройдет экспорт, у нас попробует погрузится из этого пути библиотека, но перед этим необходимо не забыть сделать ldconfig.

Читайте также:  Windows emulators mac os

Онлайн курс по Linux

Мы собрали концентрат самых востребованных знаний, которые позволят тебе начать карьеру администратора Linux, расширить текущие знания и сделать уверенный шаг к DevOps

Источник

Как установить переменную окружения LD_LIBRARY_PATH в Linux

Сначала я выполнил команду: export LD_LIBRARY_PATH=/usr/local/lib

Затем я открыл файл .bash_profile : vi

/.bash_profile .
В этом файле я поставил:

Затем, если терминал закрыт и перезапущен, ввод echo $LD_LIBRARY_PATH не отображает результат.

Как установить путь навсегда?

Вы должны добавить более подробную информацию о своем дистрибутиве, например, в Ubuntu правильным способом сделать это – добавить пользовательский .conf файл в /etc/ld.so.conf.d , например

внутри файла вы должны написать полный путь к каталогу, который содержит все библиотеки, которые вы хотите добавить в систему, например

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

Сохраните и запустите sudo ldconfig , чтобы обновить систему с помощью этих библиотек.

КОРРЕКЦИЯ: Я должен взять мой собственный совет и фактически прочитать документацию. В нем говорится, что это не относится к LD_LIBRARY_PATH: поскольку Ubuntu 9.04 Jaunty Jackalope, LD_LIBRARY_PATH не может быть установлен в файлах $HOME/.profile,/etc/profile, а также /etc/environment. Вы должны использовать конфигурационные файлы /etc/ld.so.conf.d/.conf. * Таким образом, user1824407 отвечает на вопрос.

Сохраняйте предыдущий путь, не перезаписывайте его:

Вы можете добавить его в свой файл

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

/.bashrc или просто выйти из системы и снова войти в систему.

Поместите export LD_LIBRARY_PATH=/usr/local/lib в

/.bashrc [желательно в конец script, чтобы избежать каких-либо переопределений между ними, по умолчанию

/.bashrc поставляется со многими операторами if-else ]

Сообщайте, что всякий раз, когда вы открываете новый терминал/консоль, LD_LIBRARY_PATH будет отображаться

По какой-то причине никто не упомянул о том, что после редактирования bashrc необходимо повторно загрузить. Вы можете либо выйти из системы, либо войти в систему (как указано выше), но вы также можете использовать команды: source

В качестве альтернативы вы можете выполнить программу с указанным библиотекой dir:

    Перейдите в домашнюю папку и отредактируйте файл .profile

Поместите следующую строку в конец

Сохранить и выйти.

Выполните эту команду

Я делаю следующее в Mint с 15 по 17, также работает на сервере ubuntu 12.04 и выше:

прокрутите страницу вниз и добавьте:

Все пользователи имеют добавленную переменную окружения.

Вы можете попробовать добавить пользовательский script, скажем myenv_vars.sh в /etc/profile.d .

Добавьте это в пустой файл и сохраните его.

Выход и логин, LD_LIBRARY_PATH будут установлены навсегда.

Источник

Оцените статью