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

Системы Unix позволяют нам создавать и использовать два типа библиотек — статические библиотеки и общие (или динамические) библиотеки.

В этом посте я подробно объясню использование статической библиотеки.

Как создать статическую библиотеку?

Допустим, у вас есть файлы C (*.c) с определениями функций в текущем каталоге, включая заголовочный файл, содержащий функции прототипы. Ниже я создал папку с именем blog_post, содержащую заголовочный файл holberton.h.

Давайте скомпилируем файлы, используя флаг -c для создания объектных (.o) файлов:

Теперь мы можем создать статическую библиотеку. Заархивируем все объектные файлы и назовем нашу библиотеку static_library:

Мы можем сделать это с помощью команды ar(для «архива») с флагом «c», чтобы создать библиотеку, если она не существует, и флагом «r», чтобы заменить старые объектные файлы в библиотеке на новые. Чтобы просмотреть содержимое архива, мы используем команду ar -t.

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

$ ranlib static_library.a

Теперь давайте наслаждаться нашей библиотекой. Я люблю цифры, поэтому давайте создадим основной файл со следующим содержимым:

У нас есть определение функции, которая проверяет наличие цифр. Итак, давайте скомпилируем наш основной файл следующим образом и запустим нашу программу:

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

Обратите внимание: если вы называете статическую библиотеку первыми тремя буквами "lib", вы можете опустить префикс "lib" и ".a". > суффикс при упоминании библиотеки в команде ссылки. Компоновщик присоединяет эти части обратно к имени библиотеки, чтобы создать имя файла для поиска. Таким образом, ваша команда компиляции для библиотеки «libstatic.a» будет выглядеть следующим образом:

$ gcc main.c -L. статическая цифра -o

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