Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lection11_компиляторы.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
234.5 Кб
Скачать

Создание и использование библиотек: статических, совместно используемых и динамических

В программах на языке С часто встречаются функции, которые достаточно один раз скомпилировать, а затем можно многократно использовать. Кроме того, существуют функции, которые могут применяться программистом при написании других программ. Обычно такие функции предназначены для выполнения стандартных задач, таких как ввод-вывод данных из базы данных или вывод данных на экран. Можно предварительно откомпилировать подобные функции и поместить их в особый файл объектного кода, именуемый библиотекой. Функции такого библиотечного файла могут объединяться с программой с помощью редактора связей. Это позволяет программисту избежать про­блем, связанных с компиляцией названных функций для каждой из разрабатываемых программ.

При разработке приложений различных типов используются специализированные библиотеки, которые находятся в системном каталоге. Например, в названном каталоге можно найти библиотеку libdbm, которая содержит функции dbm. Эти функции обес­печивают доступ к файлам баз данных, и их можно применять в пользовательских программах, выполняя компоновку с данной библиотекой. В математических прило­жениях используется математическая библиотека, libm, а в приложениях X Window — библиотека Xlib, libXll. Во всех прикладных программах применяются стандартные библиотеки С, libc, которые содержат функции для выполнения таких задач, как управ­ление памятью и организация ввода-вывода (сейчас доступна новая версия библиотеки GNU, libc 2.0). Эти библиотеки находятся в системных каталогах, таких как /usr/lib, и могут применяться любым пользователем системы. Можно создавать и собственные пользовательские библиотеки, которые будут либо применяться в какой-то специальной программе, либо предоставляться в распоряжение других программистов.

Библиотеки могут быть статическими, динамическими или совместно используемы­ми. Статическая библиотека — это библиотека, код которой включается в программу на этапе компиляции. Коды совместно используемой библиотеки становятся доступными для загрузки при выполнении программы. Программа, работающая с совместно исполь­зуемыми библиотеками, просто создает список библиотек, необходимых для ее функ­ционирования. Затем, при выполнении программы, эти библиотеки загружаются, и ис­полняемая программа получает доступ к содержащимся в них функциям. Динамическая библиотека является разновидностью совместно используемой библиотеки. Она также может быть загружена при выполнении программы. Однако она не загружается до тех пор, пока к ней не обратится определенная команда программы. Затем эта библиотека может быть выгружена из памяти, а ее место займет другая библиотека. За счет при­менения совместно используемых и динамических библиотек можно намного уменьшить размер исполняемой программы. Вместо того чтобы включать библиотеку в состав ис­полняемой программы, достаточно сослаться на нее.

Большинство существующих библиотек являются совместно используемыми библио­теками. Возможность их применения была обеспечена в результате внедрения формата ELF для двоичных исполняемых файлов, хотя для совместно используемых библиотек (специально обозначенных) может применяться более старый формат, a.out. В настоя­щее время формат ELF является стандартным для всех двоичных файлов в Linux.

Использование библиотек GNU определяется лицензией LGPL (Library GNU Public License). Условия этой лицензии отличаются от условий стандартной лицензии GNU тем, что программы, разработанные с их использованием, могут поставляться на ком­мерческой основе. Однако исходный код самих библиотек предоставляется в общее пользование.

Библиотеки, доступные в локальной системе, находятся в каталогах /usr/lib и /lib. Названия их всегда начинаются с префикса lib. За этим префиксом следует название библиотеки и суффикс. Используемый суффикс зависит от типа библиотеки. Для со­вместно используемых библиотек применяется суффикс .so, за которым следует номер версии этой библиотеки. Для статической библиотеки используется расширение .а. Для совместно используемых библиотек в старом формате a.out применяется расширение .sa.

libимя.so.старший_номер.младший_номер

libимя. а

В качестве параметра имя может применяться любая строка, которая однозначно иден­тифицирует библиотеку. Можно использовать слово, несколько символов или один сим­вол. В названии совместно используемой математической библиотеки libm.so..5 имя биб­лиотеки состоит из одной буквы m и старшего номера версии 5. Библиотека libm.a является статической математической библиотекой. Библиотека функций X Window на­зывается libXll.so.6. В этом случае сама библиотека X Window однозначно идентифи­цируется буквами XII и номером версии 6.

Для компоновки библиотек с разработанными программами необходимо использо­вать компилятор gcc. Так, библиотека libc.so.5 содержит стандартные функции ввода-вывода. При создании исполняемого файла редактор связей автоматически ищет эту библиотеку и связывает ее с программой. Стандартная библиотека ввода-вывода содер­жит множество функций, которые включают такие операции, как printf. Существуют и другие системные библиотеки, такие как, например, математическая библиотека, ко­торые можно использовать при разработке программ. Хотя связь с библиотекой libc.so.5 создается автоматически, ссылки на многие другие системные библиотеки должны быть установлены непосредственно с помощью командной строки компилятора.

Большинство совместно используемых библиотек находятся в каталогах /usr/lib и /lib. Поиск в этих каталогах производится в первую очередь. Некоторые совместно используемые библиотеки находятся в специальных каталогах. Список этих каталогов приведен в файле конфигурации /etc/ld.conf. Поиск библиотек производится и в этих каталогах. По умолчанию система Linux сначала ищет совместно используемые биб­лиотеки, а затем выполняет поиск статических библиотек. При обновлении одной из совместно используемых библиотек или установке новой библиотеки необходимо вы­полнить команду ldconfig для переопределения записи этой библиотеки в файле /etc/ld.conf и установления связей с нею (при инсталляции с помощью пакета RPM это обновление производится автоматически).

Для установления связей с файлом библиотеки, находящимся в одном из каталогов поиска, необходимо при вызове компилятора gcc использовать параметр -1. После этого параметра должно следовать уникальное имя библиотеки: lимя. Для указания редактору связей использовать стандартную математическую библиотеку в командной строке компилятора gcc нужно ввести команду -lm. Опция -1 определяет первооче­редной поиск файла библиотеки с именем \\bname.so, в данном случае libm.so. При этом устанавливается связь с реально существующим файлом библиотеки. В следующем примере создается программа bookrecs, которая будет связана с математической биб­лиотекой. Обратите внимание на использование параметра -lm.

$ gcc main.с io.c -о bookrecs -lm

В настоящее время доступно множество различных библиотек. Одна из самых по­пулярных библиотек именуется libncurses.a. Эта библиотека содержит процедуры, управ­ляющие перемещением курсора. Для установления связей с ней нужно в командной строке ввести -lncurses. В следующем примере программист вызывает две библио­теки: математическую библиотеку и библиотеку, управляющую движением курсора.

$ gcc main.с io.c -о bookrecs -lm -lncurses

Для ссылки на библиотеку, которая находится в каталоге, не описанном в файле /etc/ld.conf, необходимо указать этот каталог в командной строке, воспользовавшись параметром -Ldir. Этот параметр добавляет введенный каталог к списку тех каталогов, в которых будет производиться поиск библиотек при указании параметра -1. В сле­дующем примере программист устанавливает связь с библиотекой myio.so, расположен­ной в каталоге mydir. Для совместно используемых библиотек в первую очередь должны быть установлены имена ссылок dl и Id, такие, как libmyio.so и libmyio.so.1 для файла libmyio.so.1.0.

gcc main.с -о bookrecs -Lmydir -lmyio

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]