Путь поиска библиотек linux

Обновлено: 05.07.2024

По умолчанию библиотеки расположены в / usr / local / lib, / usr / local / lib64, / usr / lib и / usr / lib64; библиотеки запуска системы находятся в / lib и / lib64. Однако программисты могут устанавливать библиотеки в произвольных местах. Путь к библиотеке можно определить в / etc / ld.

Как установить путь к библиотеке в Linux?

Во время выполнения сообщите операционной системе, где находятся разделяемые библиотеки API, установив переменную среды LD_LIBRARY_PATH. Установите значение на matlabroot / bin / glnxa64: matlabroot / sys / os / glnxa64. Используемая вами команда зависит от вашей оболочки.

Какой путь к библиотеке?

. libPaths - это используется для получения или установки деревьев библиотек, о которых знает R (и, следовательно, используется при поиске пакетов). Если вызывается с аргументом new, путь поиска библиотеки устанавливается на существующие каталоги в уникальном (c (new,. Library.

Как мне увидеть все библиотеки в Linux?

Как узнать, какие пакеты установлены в Ubuntu Linux?

  1. Откройте приложение терминала или войдите на удаленный сервер с помощью ssh (например, ssh user @ sever-name)
  2. Запустите команду apt list –installed, чтобы вывести список всех установленных пакетов в Ubuntu.

What is Ld library path linux?

LD_LIBRARY_PATH - это путь к библиотеке по умолчанию, доступ к которому осуществляется для проверки доступных динамических и разделяемых библиотек. Это характерно для дистрибутивов Linux. Это похоже на переменную среды PATH в окнах, в которой компоновщик проверяет возможные реализации во время компоновки.

Смотрите также Как переместить приложения на Android-бокс?

Что такое Dlopen в Linux?

dlopen () Функция dlopen () загружает файл динамического общего объекта (разделяемой библиотеки), названный строкой с завершающим нулем filename и возвращает непрозрачный «дескриптор» загруженного объекта. … Если имя файла содержит косую черту («/»), то оно интерпретируется как (относительный или абсолютный) путь.

Что такое команда LDD в Linux?

Ldd - это мощный инструмент командной строки, который позволяет пользователям просматривать зависимости общих объектов исполняемого файла. Библиотека относится к одному или нескольким предварительно скомпилированным ресурсам, таким как функции, подпрограммы, классы или значения. Каждый из этих ресурсов объединяется для создания библиотек.

Где находится путь к библиотеке Java?

4. Установка java. путь к библиотеке. используя Eclipse

  1. Выберите Путь сборки → Настроить путь сборки……
  2. В появившемся окне выберите вкладку Библиотеки.
  3. Затем разверните параметр «Системная библиотека JRE» и выберите расположение собственной библиотеки.
  4. Нажмите на Edit……
  5. Найдите нужную библиотеку и нажмите ОК.
  6. Закройте окно.

Почему Ld_library_path плохой?

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

Что такое Cpath?

CPATH указывает список каталогов для поиска, как если бы он был указан с -I , но после любых путей, указанных с параметром -I в командной строке. Эта переменная среды используется независимо от того, на каком языке выполняется предварительная обработка. … Пустые элементы могут появляться в начале или в конце пути.

Смотрите также Как мне найти устройства PCI в Linux?

Как использовать find в Linux?

Команда поиска используется для поиска и найдите список файлов и каталогов на основе условий, указанных вами для файлов, соответствующих аргументам. Команда find может использоваться в различных условиях, например, вы можете искать файлы по разрешениям, пользователям, группам, типам файлов, дате, размеру и другим возможным критериям.

Как мне найти пакеты в Linux?

В системах Ubuntu и Debian вы можете искать любой пакет просто по ключевому слову, относящемуся к его названию или описанию, через поиск apt-cache. Результат вернет вам список пакетов, соответствующих вашему ключевому слову. Как только вы найдете точное имя пакета, вы можете использовать его с apt install для установки.

Как проверить, установлена ​​ли библиотека в Linux?

Если он установлен, вы получите строку для каждой доступной версии. Замените libjpeg любой библиотекой, которая вам нужна, и у вас будет общий, независимый от дистрибутива* способ проверки наличия библиотеки. Если по какой-то причине путь к ldconfig не задан, вы можете попробовать вызвать его, используя полный путь, обычно / sbin / ldconfig.

Как мы все знаем, Путь поиска по умолчанию для динамических библиотек Linux /lib и /usr/lib . После создания динамической библиотеки она обычно копируется в эти две директории. Когда программе требуется динамическая библиотека и динамическая библиотека не загружена в память, система автоматически перейдет к этим двум путям поиска по умолчанию, чтобы найти соответствующий файл динамической библиотеки, а затем загрузит файл в память. Вы можете использовать функции в динамической библиотеке и другие ресурсы в динамической библиотеке. В Linux, в дополнение к пути поиска по умолчанию, путь поиска динамической библиотеки также можно указать следующими тремя способами.

Способ 1: в файле конфигурации /etc/ld.so.conf указывает путь поиска динамической библиотеки.

Вы можете указать путь поиска для динамических библиотек, отредактировав файл конфигурации /etc/ld.so.conf, и каждый файл в этом файле является путем поиска динамических библиотек. После редактирования файла вы должны выполнить команду ldconfig, чтобы изменения вступили в силу. Мы проиллюстрируем этот метод на примере 1.

Мы используем следующую команду для создания динамической библиотеки libpos.so с исходной программой pos_conf.c (см. Программу 1). Подробную информацию о процессе создания см. В статье [1].

Программа 1: pos_conf.c

Затем скомпилируйте main.c (см. Программу 2) с помощью следующей команды для генерации целевой программы поз.

Программа 2: main.c

Затем переместите файлы библиотеки в каталог / root / test / conf / lib.

Наконец, отредактируйте файл конфигурации /etc/ld.so.conf и добавьте в файл строку «/ root / test / conf / lib».

Попробуйте программу поз.

./pos: error while loading shared libraries: libpos.so: cannot open shared object file: No such file or directory

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

Программа успешно работает и выводит правильный результат.

Способ 2: через переменные среды LD_LIBRARY_PATH указывает путь поиска динамической библиотеки (!).

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

Однако настройка LD_LIBRARY_PATH является глобальной, а чрезмерное использование может повлиять на работу других приложений, поэтому она в основном используется для отладки. (Недостатки LD_LIBRARY_PATH и рекомендации по их использованию см. В разделе «Почему LD_LIBRARY_PATH плохой»). Как правило, рекомендуется использовать параметр -R или -rpath команды gcc, чтобы указать путь поиска библиотеки во время компиляции, а информация о пути библиотеки будет сохранена в исполняемом файле. При запуске он напрямую перейдет по этому пути, чтобы найти библиотеку, чтобы избежать Поиск осуществляется с помощью переменной среды LD_LIBRARY_PATH.

Способ поясняется ниже с помощью примера 2.

Мы используем следующую команду для создания динамической библиотеки libpos.so с исходной программой pos_env.c (см. Программу 3).

Программа 3: pos_env.c

Исполняемый исполняемый файл pos может использовать целевую программу pos, полученную в примере 1, и его не нужно заново компилировать. Поскольку функция pos в pos_conf.c и функция pos в pos_env.c имеют один и тот же прототип и одно и то же имя динамической библиотеки, это похоже на изменение динамической библиотеки pos и ее повторное создание. Это одно из преимуществ использования динамических библиотек.

Затем переместите динамическую библиотеку libpos.so в каталог / root / test / conf / lib.

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

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

Программа pos запускается успешно, и выводится результат «/ root / test / env / lib», который в точности является результатом функции pos в программе pos_env.c. Поэтому динамическая библиотека, которую ищет программа pos, - это /root/test/env/lib/libpos.so.

Метод 3: Укажите динамический путь поиска библиотеки программы при компиляции объектного кода.

Вы также можете указать путь поиска динамической библиотеки программы при компиляции объектного кода. Это параметр через gcc " -Wl,-rpath, "Укажите (как показано в примере 3). Если указано несколько путей поиска в динамической библиотеке, пути разделяются двоеточием": ".

Мы используем следующую команду для создания динамической библиотеки libpos.so с исходной программой pos.c (см. Программу 4).

Программа 4: поз.с

Поскольку при компиляции объектного кода нам нужно указать путь поиска динамической библиотеки исполняемого файла, нам нужно перекомпилировать исходную программу main.c (см. Программу 2) с помощью команды gcc, чтобы сгенерировать исполняемый файл pos.

Попробуйте запустить программу поз снова.

Программа pos успешно работает, и результат точно соответствует функции pos в pos.c. Поэтому динамическая библиотека, которую ищет программа pos, - это ./libpos.so.

Три метода указания пути поиска динамической библиотеки описаны выше, плюс путь поиска динамической библиотеки по умолчанию / lib и / usr / lib, всего пять путей поиска динамической библиотеки, так каков порядок их поиска?

При представлении вышеупомянутых трех методов были созданы динамические библиотеки ./libpos.so, /root/test/env/lib/libpos.so и /root/test/conf/lib/libpos.so соответственно. Мы используем исходную программу pos_lib.c (см. Программу 5) для создания динамической библиотеки /lib/libpos.so и исходную программу pos_usrlib.c (см. Программу 6) для создания динамической библиотеки /usr/lib/libpos.so.

Программа 5: pos_lib.c

Программа 6: pos_usrlib.c

Таким образом, мы получаем пять динамических библиотек libpos.so. Эти динамические библиотеки имеют одно и то же имя, и все они содержат общую функцию pos одного и того же прототипа. Но место хранения отличается, и результат, напечатанный функцией public, отличается. Открытая функция pos в каждой динамической библиотеке выводит место, где хранится динамическая библиотека. Таким образом, мы можем узнать, какую динамическую библиотеку она искала, выполнив исполняемый файл pos в Примере 3, чтобы получить первый порядок поиска динамической библиотеки, затем удалить динамическую библиотеку и затем выполнить программу pos, чтобы получить вторую Путь поиска в динамической библиотеке, а затем удалите вторую найденную динамическую библиотеку, поэтому назад и вперед вы можете получить порядок, в котором Linux ищет динамические библиотеки. Соответствие между выходными результатами программы pos и найденными динамическими библиотеками показано в таблице 1:

Вывод программы Динамическая библиотека используется Соответствующий метод определения пути поиска динамической библиотеки
./ ./libpos.so Динамический путь поиска библиотеки, указанный при компиляции объектного кода
/root/test/env/lib /root/test/env/lib/libpos.so Путь поиска в динамической библиотеке, указанный в переменной среды LD_LIBRARY_PATH
/root/test/conf/lib /root/test/conf/lib/libpos.so Путь поиска динамической библиотеки, указанный в файле конфигурации /etc/ld.so.conf
/lib /lib/libpos.so Путь поиска динамической библиотеки по умолчанию / lib
/usr/lib /usr/lib/libpos.so Путь поиска динамической библиотеки по умолчанию / usr / lib

Таблица 1: Соответствие между выводом программы pos и динамической библиотекой

Создайте каждую динамическую библиотеку и поместите ее в соответствующий каталог. Тестовая среда готова. Запустите программу pos и установите переменную окружения LD_LIBRARY_PATH в командной строке.

В соответствии с результатом вывода программы pos первый поиск - это путь поиска динамической библиотеки, указанный при компиляции объектного кода. Затем мы удалили динамическую библиотеку ./libpos.so и запустили указанную выше команду, чтобы попробовать.

rm: remove regular file `libpos.so'? y

Согласно выводу программы pos, путь второго поиска в динамической библиотеке указывается переменной среды LD_LIBRARY_PATH. Давайте удалим /root/test/env/lib/libpos.so и запустим указанную выше команду.

rm: remove regular file `/root/test/env/lib/libpos.so'? y

Путь поиска для третьей динамической библиотеки - это путь, указанный в файле конфигурации /etc/ld.so.conf. Удалите динамическую библиотеку /root/test/conf/lib/libpos.so и выполните указанную выше команду.

rm: remove regular file `/root/test/conf/lib/libpos.so'? y

Путь поиска для четвертой динамической библиотеки - это путь поиска по умолчанию / lib. Давайте удалим динамическую библиотеку /lib/libpos.so и запустим указанную выше команду.

rm: remove regular file `/lib/libpos.so'? y

Последний путь поиска в динамической библиотеке - это путь поиска по умолчанию / usr / lib.

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

1. Путь поиска динамической библиотеки, указанный при компиляции кода объекта;

2. Путь поиска в динамической библиотеке, заданный переменной среды LD_LIBRARY_PATH;

3. Путь поиска динамической библиотеки, указанный в файле конфигурации /etc/ld.so.conf;

4. Путь поиска динамической библиотеки по умолчанию / lib;

5. По умолчанию путь поиска динамической библиотеки - / usr / lib.

Интеллектуальная рекомендация


WECHAT MILLY WAY POINT CAMENT CARD - СОВРЕМЕННЫЕ СТРАНИЦЫ ПРОГЛЯЮТНОЕ ЗНАЧЕНИЕ (Запрос)

WECHAT Small Pass Pass Value и значение приобретения: 1. Установите способ настройки идентификатора идентифицирует значение параметра, передаваемое после прыжка; 2, используя метод Data-XXXX для идент.


Текущая задача Узел больше экземпляров


[Linux] Программирование сетевых сокетов UDP

Что такое протокол UDP Протокол UDP называетсяПротокол пользовательских датаграмм UDP - протокол транспортного уровня Без установления соединения, ненадежная передача, ориентированная на дейтаграмму П.



Основная идея обработки больших данных - разделяй и властвуй

Разделяй и властвуй - «разделяй и властвуй» Как мы все знаем, компьютеры очень быстрые и используются людьми. Однако независимо от того, насколько быстрым является компьютер, способность о.

Для этого вопроса я буду использовать конкретный пример, но на самом деле это обобщает практически любой бинарный файл в linux, который не может найти свои зависимые библиотеки. Итак, у меня есть программа, которая не запускается из-за отсутствия библиотек:

ldd проливает свет на проблему:

Однако корона установлена:

Как мне указать двоичному файлу, где искать «недостающую» библиотеку?

Для разового выбора установите для переменной LD_LIBRARY_PATH список каталогов, разделенных двоеточиями, для поиска. Это аналогично PATH для исполняемых файлов, за исключением того, что стандартные системные каталоги дополнительно ищутся после тех, которые указаны в среде.

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

Список стандартных системных каталогов хранится в /etc/ld.so.conf . Последние системы позволяют этому файлу включать другие файлы; если у вас есть что-то вроде этого include /etc/ld.so.conf.d/*.conf , создайте новый файл, /etc/ld.so.conf.d/mala.conf содержащий каталоги, которые вы хотите добавить. После того, как вы изменили /etc/ld.so.conf или включили файл, запустите, /sbin/ldconfig чтобы ваши изменения вступили в силу (это обновит кеш).

( LD_LIBRARY_PATH также применимо ко многим другим приложениям, включая FreeBSD, NetBSD, OpenBSD, Solaris и Tru64. HP-UX имеет SHLIB_PATH и Mac OS X имеет DYLD_LIBRARY_PATH . /etc/ld.so.conf У большинства аналогов есть аналоги, но расположение и синтаксис отличаются более широко.)

Фантастика, большое спасибо. Я понятия не имел о /etc/ld.so.conf, и это будет очень полезно для меня в будущем.

Если вы хотите избежать LD_LIBRARY_PATH, вы также можете сделать это во время ссылки:

-Wl, . используется для передачи дополнительных команд компоновщику, и в этом случае с -R вы указываете компоновщику сохранить этот путь как «путь поиска по умолчанию» для .so.

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

Но если у рассматриваемой библиотеки есть общие библиотеки для поиска, rpath, хранящийся в двоичном файле, не применяется рекурсивно к поискам в подбиблиотеке. Я не нашел способа обойти это, кроме установки LD_LIBRARY_PATH в среде, которая затем применяется к рекурсивным поискам . @Ethan: правда. Но что также верно, так это то, что обычные сценарии, в которых вы хотите «упаковать» разделяемые библиотеки для некоторого двоичного файла, это то, где вы помещаете их все вместе; Например /opt/mypackage/bin/someBinary , вам понадобятся библиотеки, в которых вы храните /opt/mypackage/lib/ . Практически все проприетарные SW, установленные в / opt, следуют этому правилу - это означает, что описанный выше способ будет охватывать все такие установки. Затем они обычно добавляют также символическую ссылку в / usr / bin, которая указывает на двоичный файл в / opt - зная, что «путь поиска по умолчанию» найдет .so файлы в соответствующей /opt/. /lib папке. да, в моем случае я хотел протестировать пакет, ссылаясь на его каталог сборки, а не устанавливая его . (но пакет имел несколько внутренних .so с некоторыми взаимозависимостями . различные обходные пути, но просто раздражающие)

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

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

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

В этой статье мы подробно рассмотрим что такое библиотеки Ubuntu, как их устанавливать, где брать и что делать если библиотека установлена, а программа говорит что ее нет. Мы не будем трогать создание библиотек, это совсем не наша тема. Как обычно, начнем с теории.

Что такое библиотеки

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

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

Не нужно думать что библиотеки есть только в Linux, в Windows они тоже есть, только имеют другой формат и расширение dll. В Linux же все библиотеки находятся в папах /lib/, /usr/lib, /usr/local/lib или для 64 битных систем также появляется папка lib64 во всех этих подкаталогах, для библиотек специфичных для этой архитектуры. Библиотека имеет расширение .so и ее название начинается со слова lib. Например, libfuse.so, libc.so.

Дальше, после расширения файла .so идет номер версии библиотеки. Номер версии меняется всякий раз, когда разработчики вносят в нее изменения ломающие совместимость со всеми рассчитанными на нее программами. В таком случае в системе будут уже две библиотеки и каждая программа будет использовать правильную версию. Например, glibc.so.6 и glibc.so.5.

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

linux-vdso.so.1 (0x00007ffd99167000)
libmount.so.1 => /usr/lib64/libmount.so.1 (0x00007f0f6beb0000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0f6bb08000)
libblkid.so.1 => /usr/lib64/libblkid.so.1 (0x00007f0f6b8c8000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f0f6b6a4000)
/lib64/ld-linux-x86-64.so.2 (0x000055aca8227000)
libuuid.so.1 => /usr/lib64/libuuid.so.1 (0x00007f0f6b49f000)
libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007f0f6b238000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0f6b034000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0f6ae17000)

Также эта информация может быть полезна при создании портативных версий программ. А теперь давайте рассмотрим как устанавливаются библиотеки в Ubuntu.

Установка библиотек в Ubuntu

Обычно, если вы используете менеджер пакетов вашего дистрибутива для установки новых программ, то библиотеки устанавливаются автоматически. Но если вы хотите собрать программу из исходников или запустить 32 битную программу на 64 битной системе могут начаться проблемы. Например, при запуске или компиляции программы вы получаете ошибку:

error while loading shared libraries: xxxx.so.0
cannot open shared object file no such file or directory

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

apt search libfuse

library

Как видите, найдено два варианта библиотеки, libfuse2 и libfuse-dev.

Если библиотека нужна обычной программе и ее не нужно собирать из исходников, то будет достаточно установить библиотеку ubuntu без префикса dev. Например:

sudo apt install libfuse2

Если же вам нужно собрать приложение из исходников, то кроме обычной библиотеки понадобятся заголовочные файлы, в которых содержится описание реализованных в библиотеке функций. Такие пакеты имеют приставку dev, например, libfuse-dev, тогда нужно устанавливать этот пакет, а он уже в зависимостях потянет и обычную библиотеку, если она еще не установлена:

sudo apt install libfuse-dev

Много проблем может вызвать ситуация, когда вам нужно запустить 32 битную программу в 64 битной системе. Например, если вы установили 64 битную версию библиотеки, а программа все равно говорит о том, что не может ее найти, возможно это 32 битная программа и ей необходима именно 32 библиотека. Если программа не устанавливается с помощью пакетного менеджера, вам тоже придется устанавливать библиотеки вручную.

Посмотреть разрядность бинарника можно с помощью утилиты file:

library3

На скриншоте показаны два варианта вывода программы, для 32 бит, в нашем случае Skype и для 64 - mount.

Для того чтобы установить библиотеку Ubuntu с архитектурой i386 сначала необходимо добавить поддержку архитектуры i386 в dpkg:

sudo dpkg --add-architecture i386

Затем обновляем наши репозитории:

sudo apt update

А во время установки нужной вам библиотеки теперь необходимо указать архитектуру через двоеточие после имени пакета:

sudo apt install libfuse-dev:i386

library1

Если вы уверенны, что библиотека установлена, но программа все равно говорит, что такой библиотеки нет, то возможно, ей просто нужна другая версия библиотеки. Например, в системе есть libudev.so.0, а программе нужна libudev.so.0.1. Такое случается, если вы попытаетесь установить пакет для другого дистрибутива, особенно в Red Hat системах. Если в репозиториях нет нужной версии библиотеки, то скорее всего, они одинаковы, и можно просто создать символическую ссылку:

ln -s /lib/libudev.so.0 /lib/libudev.so.0.1

Затем программа найдет нужную библиотеку.

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

Установка библиотек ubuntu уже рассмотрена, но хотелось бы упомянуть еще пару моментов. Как я сказал, библиотеки ubuntu размещаются в определенных каталогах, но расположение библиотек можно настроить.

Перед тем как библиотека будет подключена к программе, ее должна найти в системе специальная программа - менеджер библиотек. Он берет адреса библиотек из файла /etc/ld.cache, а этот файл формируется утилитой ldconfig, на основе файлов конфигурации /etc/ld.so.conf.

В этом файле перечислены все пути к библиотекам. Если вы хотите добавить свою папку для библиотек просто добавьте ее в этот файл:

Затем обновите кэш просто выполнив:

Теперь ваша библиотека может быть загружена программой, например, вы можете добавить путь /opt/lib или даже /home/user/lib. И система будет нормально грузить оттуда библиотеки.

Посмотреть какие библиотеки находятся в кеше ld.cache можно командой:

Также мы можем проверить находится ли там определенная библиотека:

ldconfig -p | grep libjpeg

library2

Еще один способ указать программе где нужно искать библиотеки - это переменная LD_LIBRARY_PATH. Например:

Теперь программы, запускаемые в этом терминале, кроме стандартных путей поиска библиотек, будут использовать и указанную папку.

Выводы

Вот и все. Теперь вы знаете как работают библиотеки Ubuntu, как выполняется установка библиотек Ubuntu и делать так, чтобы программа видела нужную ей библиотеку. У новичков это может вызвать очень много головной боли, но теперь вы знаете что делать и избежите многих ошибок. Если у вас остались вопросы, пишите в комментариях!

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

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

Примеры библиотек в Linux включают libc (стандартная библиотека C) или glibc (версия стандартной библиотеки C для GNU), libcurl (библиотека многопротокольной передачи файлов), libcrypt (библиотека, используемая для шифрования, хеширования и кодирования в C) и многие другие. .

Linux поддерживает два класса библиотек, а именно:

  • Статические библиотеки - статически привязываются к программе во время компиляции.
  • Динамические или разделяемые библиотеки - загружаются при запуске программы и загружаются в память, а привязка происходит во время выполнения.

Динамические или разделяемые библиотеки можно разделить на следующие категории:

  • Динамически подключаемые библиотеки - здесь программа связана с общей библиотекой, и ядро u200bu200bзагружает библиотеку (если ее нет в памяти) при выполнении.
  • Динамически загружаемые библиотеки - программа берет на себя полный контроль, вызывая функции с библиотекой.

Общие библиотеки именуются двумя способами: имя библиотеки (также известное как soname) и «имя файла» (абсолютный путь к файлу, в котором хранится код библиотеки).

Например, soname для libc - libc.so.6: где lib - префикс, c - описательное имя, то есть общий объект, а 6 - версия. И его имя файла: /lib64/libc.so.6. Обратите внимание, что soname на самом деле является символической ссылкой на имя файла.

Общие библиотеки загружаются программами ld.so (или ld.so.x) и ld-linux.so (или ld-linux.so.x), где x - версия. В Linux /lib/ld-linux.so.x выполняет поиск и загружает все общие библиотеки, используемые программой.

Программа может вызывать библиотеку, используя ее имя или имя файла, а в пути к библиотеке хранятся каталоги, в которых библиотеки могут быть найдены в файловой системе. По умолчанию библиотеки расположены в/usr/local/lib,/usr/local/lib64,/usr/lib и/usr/lib64; библиотеки запуска системы находятся в/lib и/lib64. Однако программисты могут устанавливать библиотеки в произвольных местах.

Путь к библиотеке может быть определен в файле /etc/ld.so.conf, который вы можете редактировать с помощью редактора командной строки.

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

Если вы заглянете в каталог /etc/ld.so.conf.d, вы увидите файлы .conf для некоторых распространенных пакетов (в данном случае ядра, mysql и postgresql):

Если вы посмотрите на mariadb-x86_64.conf, вы увидите абсолютный путь к библиотекам пакета.

Приведенный выше метод устанавливает постоянный путь к библиотеке. Чтобы установить его временно, используйте переменную среды LD_LIBRARY_PATH в командной строке. Если вы хотите сохранить изменения постоянными, добавьте эту строку в файл инициализации оболочки/etc/profile (global) или

/.profile (для конкретного пользователя).

Давайте теперь посмотрим, как работать с разделяемыми библиотеками. Чтобы получить список всех зависимостей разделяемых библиотек для двоичного файла, вы можете использовать утилиту ldd. Вывод ldd имеет следующий вид:

Эта команда показывает все зависимости разделяемых библиотек для команды ls.

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

По умолчанию ldconfig считывает содержимое /etc/ld.so.conf, создает соответствующие символические ссылки в каталогах динамических ссылок, а затем записывает кеш в /etc/ld.so.cache, который затем легко используется другими программами. .

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

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

В качестве альтернативы выполните следующую команду, чтобы создать символические ссылки от soname к имени файла:

Чтобы приступить к созданию собственных библиотек, ознакомьтесь с этим руководством в Linux Documentation Project (TLDP).

На этом пока все! В этой статье мы познакомили вас с библиотеками, объяснили общие библиотеки и способы управления ими в Linux. Если у вас есть какие-либо вопросы или дополнительные идеи, которыми вы можете поделиться, используйте форму комментариев ниже.

Читайте также: