Основы программирования в Linux | страница 24
>$ ar crv libfоо.a bill.о fred.о
>а - bill.о а - fred.о
7. Библиотека создана, и в нее добавлены два объектных файла. Для того чтобы успешно применять библиотеку в некоторых системах, в особенности в производных от Berkeley UNIX, требуется создать для библиотеки индекс содержимого архива или список вложенных в библиотеку функций и переменных (table of contents). Сделайте это с помощью команды >ranlib
. В ОС Linux при использовании программных средств разработки GNU этот шаг не является необходимым (но и не приносит вреда).
>$ ranlib libfoo.a
Теперь ваша библиотека готова к использованию. Вы можете добавить следующий список файлов, которые должен обработать компилятор для создания вашей программы:
>$ gcc -о program program.о libfоо.а
>$ ./program
>bill: we passed Hello world
Можно было бы применить для доступа к библиотеке флаг >-l
, но т.к. она хранится не в одном из стандартных каталогов, вы должны сообщить компилятору место поиска с помощью флага >-L
следующим образом:
>$ gcc -о program .program.о -L. -lfoo
Опция >-L
заставляет компилятор искать библиотеки в текущем каталоге (.). Опция >-lfoo
сообщает компилятору, что нужно использовать библиотеку с именем libfoo.a (или совместно используемую библиотеку libfoo.so, если она есть). Для того чтобы посмотреть, какие функции включены в объектный файл, библиотеку или исполняемую программу, можно применить команду >nm
. Если вы взглянете на файлы program и libfoo.a, то увидите, что библиотека содержит обе функции: >fred
и >bill
, а файл program — только функцию >bill
. Когда создается программа, в нее включаются из библиотеки только те функции, которые ей действительно нужны. Вставка заголовочного файла, содержащего объявления всех функций библиотеки, не вызывает включения в конечную программу целиком всей библиотеки.
Если вы знакомы с разработкой программ в ОС Windows, то поймете, что в ОС UNIX существует ряд прямых аналогий, перечисленных в табл. 1.1.
Таблица 1.1
Элемент | UNIX | Windows |
---|---|---|
Объектный модуль | func.o | FUNC.OBJ |
Статическая библиотека | lib.a | LIB.LIB |
Программа | program | PROGRAM.EXE |
У статических библиотек один недостаток — когда вы запускаете много приложений одновременно и все они используют функции из одной библиотеки, в результате образуется множество копий одних и тех же функций в памяти и множество реальных копий функций в самих файлах программ. Это может привести к потреблению большого объема полезной памяти и дискового пространства.