Добро пожаловать обратно. Это продолжение статьи Что происходит, когда вы вводите «gcc main.c», которую я написал некоторое время назад. Если вы еще не читали ее, пожалуйста, прочтите, так как после нее будет намного больше смысла.

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

Типы библиотек

Есть два типа библиотек: статические и динамические. Статические библиотеки представляют собой наборы объектов с индексом впереди, чтобы указать адрес каждого имени. Это общепринятые библиотеки: они существуют с момента появления C.
С другой стороны, динамические библиотеки (также называемые разделяемыми библиотеками) являются передовыми. Они были представлены в 1985 году и намного эффективнее статических библиотек. Они являются частью среды выполнения, в отличие от статических библиотек. Они могут совместно использоваться (отсюда и другое название) несколькими программами без необходимости делать копии библиотеки, тем самым экономя память. Стандартная библиотека для C сама по себе является динамической библиотекой. Однако в этой статье мы сосредоточимся на статических библиотеках.

Как это работает?

Статические библиотеки создаются с помощью архиватора под названием ar. Допустим, у нас есть три файла .c, которые мы хотим использовать:

Отсюда мы можем запустить gcc с флагом -c, чтобы скомпилировать исходные файлы без компоновки.

Теперь, когда мы перечисляем каталог, у нас должны быть копии этих трех с расширением .o:

Поскольку статические библиотеки необходимо архивировать, мы будем использовать команду ar, упомянутую ранее. Мы назовем эту библиотеку libraries.a, потому что мы творческие люди. Все статические библиотеки имеют расширение .a:

Флаги -rc сообщают архиватору rзаменить старые объектные файлы в библиотеке новыми объектными файлами и cвосстановить библиотеку, если она соответственно еще не существует.
После того, как мы создали библиотеку, нам нужно ее проиндексировать.
Здесь мы представим ranlib. С помощью этого индекса компилятор сможет намного быстрее искать символы. Он также сможет убедиться, что порядок символов не важен. Я не буду вдаваться в подробности о поиске по символам на данный момент, но просто знайте, что создание индекса важно.

Теперь у нас есть индекс. Что же нам теперь делать? Ну пользуйтесь, конечно! У нас есть main.c, который мы хотим использовать с библиотекой. Это можно сделать с помощью gcc и некоторых специальных флагов:

Флаг -L сообщает компоновщику, что библиотеки будут найдены в указанном каталоге (где . указывает на текущий каталог) при запуске.

«Подожди», — можете сказать вы. «Что, черт возьми, случилось с именем файла?»

Таким образом, компоновщик фактически автоматически прикрепляет префикс lib и суффикс .a в процессе, поэтому мы намеренно опустили их. А так как вы уже читали мою статью о компиляции gcc, вы должны уже знать, что делает флаг -o.

И это все! Теперь вы на пути к использованию статических библиотек по всему королевству.

Присоединяйтесь ко мне в следующий раз для еще одного приключения в устаревшем, но увлекательном мире C!