Linux какие библиотеки использует программа
Все действия в операционной системе выполняются с помощью программ, поэтому многим новичкам интересно не только использовать чужие программы, а писать свои. Многие хотят внести свой вклад в кодовую базу OpenSource.
Это обзорная статья про программирование под Linux. Мы рассмотрим какие языки используются чаще всего, рассмотрим основные понятия, а также возможности, разберем как написать простейшую программу на одном из самых популярных языков программирования, как ее вручную собрать и запустить.
1. На чем пишут программы?
Исторически сложилось так, что ядро Unix было написано на языке Си. Даже более того, этот язык был создан для написания ядра Unix. Поскольку ядро Linux было основано на ядре Minix (версии Unix), то оно тоже было написано на Си. Поэтому можно сказать, что основной язык программирования для Linux это Си и С++. Такая тенденция сохранялась на протяжении долгого времени.
Мы не будем рассматривать основы Си в этой статье. Си - сложный язык и вам понадобится прочитать как минимум одну книгу и много практиковаться чтобы его освоить. Мы рассмотрим как писать программы на Си в Linux, как их собирать и запускать.
2. Библиотеки
Естественно, что если вам необходимо вывести строку или изображение на экран, то вы не будете напрямую обращаться к видеокарте. Вы просто вызовете несколько функций, которые уже реализованы в системе и передадите им данные, которые нужно вывести на экран. Такие функции размещаются в библиотеках. Фактически, библиотеки - это наборы функций, которые используются другими программами. В них находится такой же код, как и в других программах, разница лишь в том, там необязательно присутствие функции инициализации.
Библиотеки делятся на два типа:
- Статические - они связываются с программой на этапе компиляции, они связываются и после этого все функции библиотеки доступны в программе как родные. Такие библиотеки имеют расширение .a;
- Динамические - такие библиотеки встречаются намного чаще, они загружены в оперативную память, и связываются с программной динамически. Когда программе нужна какая-либо библиотека, она просто вызывает ее по известному адресу в оперативной памяти. Это позволяет экономить память. Расширение этих библиотек - .so, которое походит от Shared Object.
Таким образом, для любой программы на Си нужно подключать библиотеки, и все программы используют какие-либо библиотеки. Также важно заметить, на каком языке бы вы не надумали писать, в конечном итоге все будет сведено к системным библиотекам Си. Например, вы пишите программу на Python, используете стандартные возможности этого языка, а сам интерпретатор уже является программой на Си/С++, которая использует системные библиотеки для доступа к основным возможностям. Поэтому важно понимать как работают программы на Си. Конечно, есть языки, вроде Go, которые сразу переводятся на ассемблер, но там используются принципы те же, что и здесь. К тому же системное программирование linux, в основном, это Си или С++.
3. Процесс сборки программы
Перед тем как мы перейдем к практике и создадим свою первую программу, нужно разобрать как происходит процесс сборки, из каких этапов он состоит.
Каждая серьезная программа состоит из множества файлов, это файлы исходников с расширением .c и заголовочные файлы с расширением .h. Такие заголовочные файлы содержат функции, которые импортируются в программу из библиотек или других файлов .с. Перед тем. как компилятор сможет собрать программу и подготовить ее к работе, ему нужно проверить действительно ли все функции реализованы, доступны ли все статические библиотеки и собрать ее в один файл. Поэтому, первым делом выполняется препроцессор, который собирает исходный файл, выполняются такие инструкции, как include для включения кода заголовочных файлов.
На следующем этапе к работе приступает компилятор, он выполняет все необходимые действия над кодом, разбирает синтаксические конструкции языка, переменные и преобразовывает все это в промежуточный код, а затем в код машинных команд, который мы можем потом посмотреть на языке ассемблера. Программа на этом этапе называется объектный модуль и она еще не готова к выполнению.
Далее к работе приступает компоновщик. Его задача связать объектный модуль со статическими библиотеками и другими объектными модулями. Для каждого исходного файла создается отдельный объектный модуль. Только теперь программа может быть запущена.
А теперь, давайте рассмотрим весь єтот процесс на практике с использованием компилятора GCC.
4. Как собрать программу
Для сборки программ в Linux используется два типа компиляторов, это Gcc и Clang. Пока что GCC более распространен, поэтому рассматривать мы будем именно его. Обычно, программа уже установлена в вашей системе, если же нет, вы можете выполнить для установки в Ubuntu:
sudo apt install gcc
Перед тем как мы перейдем к написанию и сборке программы, давайте рассмотрим синтаксис и опции компилятора:
$ gcc опции исходный_файл_1.с -o готовый_файл
С помощью опций мы говорим утилите что нужно сделать, какие библиотеки использовать, затем просто указываем исходные файлы программы. Давайте рассмотрим опции, которые будем сегодня использовать:
- -o - записать результат в файл для вывода;
- -c - создать объектный файл;
- -x - указать тип файла;
- -l - загрузить статическую библиотеку.
Собственно, это все самое основное, что нам понадобится. Теперь создадим нашу первую программу. Она будет выводить строку текста на экран и чтобы было интереснее, считать квадратный корень из числа 9. Вот исходный код:
int main() printf("losst.ru\n");
printf("Корень: %f\n", sqrt(9));
return 0;
>
Я специально добавил функцию корня чтобы показать как работать с библиотеками. Сначала нужно собрать объектный файл. Перейдите в папку с исходниками и выполните:
gcc -c program.c -o program.o
Это этап компиляции, если в программе нет ошибок, то он пройдет успешно. Если исходных файлов несколько, то такая команда выполняется для каждого из них. Далее выполняем линковку:
gcc -lm program.o -o program
Обратите внимание на опцию -l, с помощью нее мы указываем какие библиотеки нужно подключить, например, здесь мы подключаем библиотеку математических функций, иначе компоновщик просто не найдет где есть та или иная функция. Только после этого можно запустить программу на выполнение:
Конечно, все эти действия могут быть выполнены и с помощью различных графических сред, но выполняя все вручную, вы можете лучше понять как все работает. С помощью команды ldd вы можете посмотреть какие библиотеки использует наша программа:
Это две библиотеки загрузчика, стандартная libc и libm, которую мы подключили.
5. Автоматизация сборки
Когда мы рассматриваем программирование под Linux невозможно не отметить систему автоматизации сборки программ. Дело в том, что когда исходных файлов программы много, вы не будете вручную вводить команды для их компиляции. Можно записать их один раз, а затем использовать везде. Для этого существует утилита make и файлы Makefile. Этот файл состоит из целей и имеет такой синтаксис:
цель: зависимости
команда
В качестве зависимости цели может быть файл или другая цель, основная цель - all, а команда выполняет необходимые действия по сборке. Например, для нашей программы Makefile может выглядеть вот так:
program: program.o
gcc -lm program.o -o program
program.o: program.c
gcc -c program.c -o program.o
Затем вам достаточно выполнить команду make для запуска компиляции, только не забудьте удалить предыдущие временные файлы и собранную программу:
Программа снова готова и вы можете ее запустить.
Выводы
Создание программ Linux очень интересно и увлекательно. Вы сами убедитесь в этом, когда немного освоитесь в этом деле. Сложно охватить все в такой небольшой статье, но мы рассмотрели самые основы и они должны дать вам базу. В этой статье мы рассмотрели основы программирования в linux, если у вас остались вопросы, спрашивайте в комментариях!
Курс программирования на Си под Linux:
Как выяснить список всех необходимых пакетов / библиотек для работы конкретного portable приложения в Linux, если это приложение не имеет ни репозитория ни deb-пакета?
Конкретно задача связана с FreeFileSync который ни хочет запускать диалог выбора папки в KDE Plasma на Kubuntu 14.04.05. Если установить весь xubuntu-desktop то начинает работать, если только xfce4 - не начинает. Ставить весь Xubuntu-desktop не хочу, из него начинаются проблемы в KDE (сбрасывается ряд настроек окружения, повисает видимое окно plasma-desktop в верхнем левом углу и соответствующий пункт в панели задач). В общем нужно как то выяснить, чего конкретно не хватает FreeFileSync. Чем это можно сделать? Либо просто скажите, что ему нужно. В Доках смотрел - не нашёл.
Читай в readme к продукту, там должны быть указаны зависимости (dependencies), либо если есть исходники читай в readme какие зависимости нужны для сборки, часть из них будет достаточна для работы, за вычетом компилятора.
Либо зависимости должны быть указаны разработчиком продукта на его сайте.
Если исходников нет, разработчик не указал, то можешь посмотреть зависимости к этому продукту в репозитории какого-либо дистрибутива Linux.
Запусти из консоли и почитай, на что ругается. Ещё попробуй ldd ./my_app и посмотри, чего не находит.
fehhner ★★★★★ ( 06.11.18 10:13:24 )
Последнее исправление: fehhner 06.11.18 10:13:35 (всего исправлений: 1)
В общем случае, если есть бинарник, то его зависимости можно посмотреть с помощью ldd. Но потом нужно смапить это на пакеты, в которых эти зависимости присутствуют. Если честно, я бы все-таки пошел чуть по-другому: определил в каком пакете FreeFileSync, и какие зависимости у этого пакета. Знаю как такое сделать в Gentoo, но по Ubuntu не подскажу.
1) список всех необходимых библиотек
2) список всех необходимых пакетов (по либам) в зависимости от системы (deb, rpm, tar.xz). Для Ubuntu:
Deleted ( 06.11.18 13:33:51 )
Последнее исправление: Deleted 06.11.18 13:43:34 (всего исправлений: 4)
wxgtk и webkit2gtk
Консоль молчит. ldd - действительно показал пачку библиотек, но вот странность - и на системе с рабочим приложением и на системе где ему чего-то не хватает список одинаковый и даже пробивка наличия каждой библиотеки при помощи ls даёт идентичный результат на обеих системах. Наверное ldd выдаёт не полный список.
я бы все-таки пошел чуть по-другому: определил в каком пакете FreeFileSync
Да нечего определять - не бывает сейчас пакетов FreeFileSync, его разраб распространяет либо как portable, либо в исходниках.
В чём сакральный смысл этой возни с бинарями опенсорсной проги? Уж либо собирай из исходников сам под свою систему, либо ставь самодостаточный пакет, например, с флатхаба.
Да нечего определять - не бывает сейчас пакетов FreeFileSync, его разраб распространяет либо как portable, либо в исходниках.
Ну так опакеть для Ubuntu. Ставить бинари, даже «самодостатьчных пакетов» - плохая практика.
А зависимости узнай через ldd.
ldd не панацея, если что-то либо не хватало бы в выхлопе ldd, бинарь же просто бы не запускался, разве нет?
А у него файловый диалог не работает. Соответственно оно не явная зависимость, а где-то через dlopen или вообще system/execve. Причём не обязательно в FreeFileSync, а может быть в wxGTK, которому нужен какой-нибудь kdialog или его xfce-шный аналог.
В чём сакральный смысл этой возни с бинарями опенсорсной проги?
А сакральный смысл был в том. Что я забыл поискать на флэтхабе! Слишком редко находил там нужное и забил ) Видимо этим способом и воспользуюсь.
На самом деле скорее всего нужен: libwebkit2gtk-3.0-dev ну или не он, что-то из того что он ставит и обновляет вместе с собой, (а это не мало, метров на 150 будет). Дело в том, что когда тестил на виртуалке его тоже пытался поставить но он целиком не влез но видимо кое чего поставил, видимо этого хватило. Так что если будете пытаться ставить пробуйте ставить в первую очередь именно libwebkit2gtk-3.0-dev, возможно хватит и этого.
Я слышал, что есть такая чудо-утилита под названием ldd, которая показывает, от каких dll-ок зависит мой исполняемый файл. Прогнал своё поделие через неё, и она мне выдал кучу библиотек, многие из которых имеют ничего мне не говорящие имена (откуда они там взялись - одному Богу известно)
Как мне по этой информации узнать, от каких deb пакетов зависит моя программа? одним словом, чё мне писать в графе Depends при использование checkinstall?
Эмм. А какие инклуды то хоть?
dpkg -S имя файла
Ты что, не знаешь какие библиотеки ты использовал? Наверняка в dpkg есть функци чтобы посмотреть какому пакету принадлежит файл.
И что с этим делать?
он мне предлагает libssl0.9.8, но я не хочу привязываться к конкретной версии ssl
Мне нужен универсальный метод быстро получить зависимости, типа:
а не сидеть часами и выяснять, к какому пакету относится тот или иной модуль, и не дрожать от мысли о том, что программа не запустится из-за того, что на компе клиента нет какой-то маленькой неприметной библиотечки
Use debhelper, Luke!
>а не сидеть часами и выяснять, к какому пакету относится тот или иной модуль, и не дрожать от мысли о том, что программа не запустится из-за того, что на компе клиента нет какой-то маленькой неприметной библиотечки
тонко
man apt-file
ТС, ты тот еще тормоз, к примеру, показывает мой хеллоуворд зависимость libc.so.6, в зависимости значит нужно пихать glibc, как то так.
> а не сидеть часами и выяснять, к какому пакету относится тот или иной модуль
это не линукс-вэй =) Здесь нужно вначале сделать тучу бесполезных времязатратных телодвижений, т.е. заняться сексом
но я не хочу привязываться к конкретной версии ssl
посмотри, какие симлинки есть на libcrypto.so.0.9.8, мб просветлит..
хотя в случае libssl, возможно, есть смысл привязываться к конкретной версии. А то при ее обновлениях универсальные проги мрут как мухи)
пока мантейнеры пакетов в кровавых битвах еще не до конца выяснили, чей пакет главнее, и что куда класть, не будет тебе такой утилиты )
резюме: предлагаю попросить в этом деле помощи у Бога лично
> Мне нужен универсальный метод быстро получить зависимости, типа:
Просто феерическая наглость.
Даю хинт. Этот универсальный метод называется «нанять человека, который разбирается в устройстве юникс и решит эту задачу за тебя».
а не сидеть часами и выяснять, к какому пакету относится тот или иной модуль, и не дрожать от мысли о том, что программа не запустится из-за того, что на компе клиента нет какой-то маленькой неприметной библиотечки
Ты не знаешь, какие библиотеки использует код, который ты сам писал? Похвально, весьма похвально.
> Просто феерическая наглость.
Ты не знаешь, какие библиотеки использует код, который ты сам писал?
жир залил весь монитор! как ты научился писать столь калорийные посты?
Все мы привыкли пользоваться программами в любой операционной системе для решения своих задач. Но за функциональностью программ стоит еще одна вещь, с которой мы редко встречаемся при обычной работе с компьютером. Это библиотеки, которые содержат общий набор функций и возможностей, используемых программами. Например, большинство программ, написанных на Си, используют стандартную библиотеку Си, в которой содержатся все основные возможности взаимодействия с системой.
У каждой программы есть свой набор библиотек, которые должны быть в системе чтобы она смогла работать. Иначе бы программистам пришлось заново изобретать различные алгоритмы, писать много кода и разработка программ занимала бы в разы больше времени. В этой статье мы собрали основные библиотеки Linux, а также их предназначение. Эта информация поможет вам лучше освоиться в системе.
Что такое библиотеки?
Как я уже говорил выше - библиотеки реализуют общие возможности, которые потом используются программами. Если говорить просто, то библиотека - это набор функций, каждую из которых можно использовать в любой программе. Например, если программе нужно вывести строку на экран, она не будет лезть прямо в буфер видеокарты, а использует функцию из стандартной библиотеки.
Библиотеки делятся на два типа - динамические и статические. Статические библиотеки linux подключаются на этапе сборки программы, а динамические - во время выполнения и они общие для нескольких программ. Нас будут интересовать именно динамические библиотеки linux. Они находятся в папках /lib, /lib64, /usr/lib, /usr/lib/x86_64-linux-gnu. Каждая библиотека имеет расширение .so, за которым следует номер версии. Этот номер увеличивается каждый раз, когда разработчики вносят серьезные изменения. Такой подход необходим для того, чтобы сохранить совместимость для программ, использующих старые версии. Например, в системе может быть две библиотеки libfuse.so.0 и libfuse.so.1. Далее мы рассмотрим основные библиотеки и их предназначение.
Как получить информацию о библиотеках?
Перед тем как перейти к рассмотрению самих библиотек, вам, наверное, будет интересно, как получить информацию о них и узнать где они находятся в вашей системе. Библиотеки Linux могут быть размещены в различных каталогах, в зависимости от дистрибутива, но посмотреть эти каталоги можно, выполнив:
Во всех перечисленных здесь каталогах находятся статические и динамически библиотеки Linux:
ls -l /lib/x86_64-linux-gnu/
Информацию о зависимостях каждой библиотеки вы можете посмотреть командой ldd:
А еще можно узнать какому пакету принадлежит библиотека в Ubuntu:
dpkg -S /lib/x86_64-linux-gnu/ld-2.24.so
Как видите, библиотека ld.so принадлежит пакету libc6, точнее она входит в набор инструментов Си. Более подробно, о том, как устанавливать новые библиотеки и решать проблемы с ними, описано в статье библиотеки Ubuntu.
Основные библиотеки
Это библиотеки основных языков программирования, которые содержат базовую функциональность для взаимодействия с системой.
- libanl.so - библиотека работы с DNS;
- libc.a - основная статическая библиотека языка Си;
- libdl.a - библиотека, отвечающая за загрузку других библиотек во время запуска программы;
- libnsl.so - работа со службой NIS;
- libstdc++.so - стандартная библиотека C++;
- libutil.so - реализует основные часто используемые функции;
- libelf.so - библиотека для работы с бинарными файлами ELF;
- libevent.so - библиотека с реализацией механизма вызова функций после события;
- libgnutls.so - библиотека с основными методами и возможностями, используемыми в стандартных утилитах Linux;
- ld-linux.so - главная библиотека, она собрана в виде статической и не имеет зависимостей. Загружает другие библиотеки и исполняемые файлы. Вы можете вызвать эту библиотеку как программу и передать ей адрес исполняемого файла для запуска.
Библиотеки кодеков
Эти библиотеки содержат наборы кодеков для воспроизведения различных медиа данных. Некоторые из них имеют несвободную лицензию или закрытый исходный код:
- liba52.so - свободный декодер ATSC A/52;
- libavfilter6.so - библиотека фильтров ffmpeg;
- libavcodec57.so - библиотека кодеков ffmpeg;
- libavformat57.so - библиотека форматов ffmpeg;
- libavutil55.so - библиотека дополнительных функций ffmpeg;
- libdv.so - программный кодек для DV;
- libmad.so - MPEG аудио декодер;
- libmpeg2.so - потоковый декодер видео данных;
- libmpg123.so - библиотека консольного плеера mpg123;
- libwebp.so - декодирование формата Webp;
- libxvidcore.so - медиа кодек MPEG-4.
Звуковые библиотеки
- libao.so - библиотека проигрывания звука с простым интерфейсом;
- libasound.so - библиотека взаимодействия со звуковой подсистемой ALSA;
- libaudio2.so - библиотека работы со звуком, входит в состав ALSA;
- libespeak.so - библиотека синтеза речи;
- libpulse.so - библиотека с основными методами PulseAudio;
Работа с архивами
- libarchive.so - библиотека для работы с архивами различных форматов;
- liblzma.so - работа с архивами LZMA.
Графические библиотеки
- libart.so - библиотека с реализацией функций для работы с 3d графикой;
- libaa.so - библиотека ASCII графики;
- libgtk-3.so - набор методов графического фреймворка GTK 3;
- libgd.so - базовые функции работы с графикой и рисования;
- libgif.so - работа с форматом изображений Gif;
- libjpeg.so - работа с изображениями Jpeg;
- libglapi.so - свободная реализация методов для работы с OpenGL;
- libgtk-x11-2.0.so - набор методов библиотеки GTK 2;
- libwx_baseu.so, libwx_baseu_net-3.0.so и другие - набор библиотек фремворка создания графических приложений WX;
- libX11.so - основные методы и функции X сервера;
- libncurses.so - одна из самых популярных библиотек псевдографики;
- libQtGui.so, libQt5Svg.so, libQt5Widgets.so и другие - библиотеки фреймворка разработки графических приложений Qt.
Работа с текстом
- libaspell.so - библиотека проверки орфографии;
- libfreetype.so - библиотека отрисовки шрифтов;
- libharfbuzz.so - библиотека обработки символов Unicode;
- libxml2.so - библиотека разбора XML;
- libyaml-0.so - библиотека разбора Yaml.
Безопасность
- libcrack.so - библиотека с реализацией методов перебора паролей для проверки их надежности;
- libcrypt.so - библиотека, отвечающая за шифрование;
- libssl3.so - библиотека шифрования SSLv3;
- libapparmor.so - библиотека управления системой безопасности AppArrmor;
- libaudit.so - библиотека слежения за состоянием системы и регистрации событий.
Библиотеки драйверов
- libcups.so - библиотека работы с принтером;
- libfuse.so - библиотека организации виртуальных файловых систем;
- libgphoto2.so - библиотека взаимодействия с камерами по USB;
- libsensors.so - используется для получения информации от датчиков на материнской плате;
- libudisks2.so - библиотека usisks, которая отвечает за автоматическое монтирование и обнаружение подключенных устройств;
- libv4l1.so - библиотека работы с веб-камерами;
- libpci.so - библиотека работы с PCI устройствами;
- libusb-1.0.so - библиотека управления USB;
- libdrm.so - библиотека с общими возможностями Direct Rendering Manager, отрисовки графики с помощью видеокарты;
- libdrm_amdgpu.so - DRM для драйвера AMDGPU;
- libdrm_intel.so - DRM для карт Intel;
- libdrm_nouveau.so - свободный DRM для видеокарт Nvidia;
- libresolv.so - библиотека получения IP адреса по имени хоста;
- libpcap.so - библиотека анализа и захвата сетевых пакетов;
- libproxy.so - настройка и управление прокси;
Эмуляция
- libSDL.so - библиотека эмуляции загрузки компьютера и базовых возможностей BIOS;
- libwine.so - библиотека прослойки для запуска приложений Windows в Linux.
- libvirt.so - библиотека управления KVM;
Выводы
В этой статье мы собрали основные библиотеки Linux, которые имеют наибольшее значение для работы операционной системы. Конечно, невозможно перечислить здесь абсолютно все библиотеки, потому что их очень много. Надеюсь эта информация была полезной для вас.
На завершение урок про библиотеки Linux:
Как вы знаете каждая программа, установленная на вашем компьютере, состоит из нескольких частей. Это непосредственно исполняемый файл, который вы запускаете через терминал, а также библиотеки с набором функций, которые может использовать программа.
Все, без исключения, программы используют библиотеки. Даже если это ваша программа и у нее нет своих библиотек, она использует стандартную библиотеку языка программирования С.
В этой статье мы подробно рассмотрим что такое библиотеки 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
Как видите, найдено два варианта библиотеки, libfuse2 и libfuse-dev.
Если библиотека нужна обычной программе и ее не нужно собирать из исходников, то будет достаточно установить библиотеку ubuntu без префикса dev. Например:
sudo apt install libfuse2
Если же вам нужно собрать приложение из исходников, то кроме обычной библиотеки понадобятся заголовочные файлы, в которых содержится описание реализованных в библиотеке функций. Такие пакеты имеют приставку dev, например, libfuse-dev, тогда нужно устанавливать этот пакет, а он уже в зависимостях потянет и обычную библиотеку, если она еще не установлена:
sudo apt install libfuse-dev
Много проблем может вызвать ситуация, когда вам нужно запустить 32 битную программу в 64 битной системе. Например, если вы установили 64 битную версию библиотеки, а программа все равно говорит о том, что не может ее найти, возможно это 32 битная программа и ей необходима именно 32 библиотека. Если программа не устанавливается с помощью пакетного менеджера, вам тоже придется устанавливать библиотеки вручную.
Посмотреть разрядность бинарника можно с помощью утилиты file:
На скриншоте показаны два варианта вывода программы, для 32 бит, в нашем случае Skype и для 64 - mount.
Для того чтобы установить библиотеку Ubuntu с архитектурой i386 сначала необходимо добавить поддержку архитектуры i386 в dpkg:
sudo dpkg --add-architecture i386
Затем обновляем наши репозитории:
sudo apt update
А во время установки нужной вам библиотеки теперь необходимо указать архитектуру через двоеточие после имени пакета:
sudo apt install libfuse-dev:i386
Если вы уверенны, что библиотека установлена, но программа все равно говорит, что такой библиотеки нет, то возможно, ей просто нужна другая версия библиотеки. Например, в системе есть 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
Еще один способ указать программе где нужно искать библиотеки - это переменная LD_LIBRARY_PATH. Например:
Теперь программы, запускаемые в этом терминале, кроме стандартных путей поиска библиотек, будут использовать и указанную папку.
Выводы
Вот и все. Теперь вы знаете как работают библиотеки Ubuntu, как выполняется установка библиотек Ubuntu и делать так, чтобы программа видела нужную ей библиотеку. У новичков это может вызвать очень много головной боли, но теперь вы знаете что делать и избежите многих ошибок. Если у вас остались вопросы, пишите в комментариях!
Читайте также: