Статические библиотеки на C

Создавая программы, мы понимаем, что во многих из них мы повторяем некоторые коды. Например, есть несколько программ, которым требуется сумма целых чисел или вычисление длины массива. Мы повторяем эти коды снова и снова.

Как работают библиотеки и почему мы их используем:

Из-за этого есть некоторые объекты, называемые библиотеками, и, например, физические библиотеки, в которых есть проиндексированные книги, которые вы можете использовать, библиотека на C хранит все эти функции, уже скомпилированные, поэтому мы можем использовать их, когда нам нужно.

Когда мы используем функцию из библиотеки, нам не нужно писать заново или копировать-вставлять код. нам не нужно компилировать код каждый раз, когда мы его используем, поэтому мы экономим много времени и можем доверять уже исправленному коду.

Есть два типа библиотек: статические и динамические. Этот пост предназначен только для статических (скоро появятся динамические библиотеки).

Статическая библиотека копируется в нашу программу при ее компиляции. Это означает, что когда мы получаем исполняемый файл, библиотека нам больше не нужна (она уже есть в нашем исполняемом файле). Библиотека может быть удалена без последствий. Еще одна важная вещь заключается в том, что исполняемый файл берет из библиотеки только то, что ему нужно, поэтому, если в библиотеке есть две функции, а нашей программе нужна только одна, эта функция копируется, а другая нет.

Как их создать:

Прежде всего, нам нужно передать наши источники .c в объектный формат (.o). Для этого вам нужно скомпилировать их с флагом -c, который сообщает компилятору, что нам не нужны исполняемые файлы, а объектные файлы (gcc -c src.c src.o ).

После этого мы создаем нашу библиотеку .a с помощью команды ar и параметров r и с. r сообщает команде ar, что она должна вставить (или заменить, если они уже есть в библиотеке), объектные файлы. Флаг c предназначен для создания библиотеки, если она не существует. (ar -rc имя_библиотеки.a src1.o src2.o …).

Практичнее делать исполняемый файл с инструкциями выше. Это делает процесс быстрее.

Наконец, каждая библиотека должна быть проиндексирована для более быстрого поиска символов внутри нее и для гарантии того, что порядок символов в библиотеке не будет иметь значения во время компиляции. Это делается с помощью команды ranlib (ranlib libname.a). Когда дата создания индекса для архивного файла старше даты модификации файла, компилятор прервется. Это можно решить с помощью ranlib для повторного создания индекса или предотвратить с помощью cp -p, если мы хотите скопировать архивные файлы в другое место. Флаг p сохраняет атрибуты архива.

Бонус: вы можете использовать команду nm, чтобы увидеть компонент библиотеки (nm libname.a).

Как их использовать:

После того, как мы создали нашу библиотеку, мы можем использовать ее, добавив имя библиотеки в список имен объектных файлов, предоставленных компоновщику, используя флаг L, который указывает компоновщика, что библиотеки могут быть найдены в данном каталоге (gcc main.o -L. -lname -o prog). Это создаст программу, используя объектный файл « main.o», а также любые требуемые символы из статической библиотеки «name». Обратите внимание, что префикс «lib» и суффикс «.a» опущены при упоминании библиотеки на команда связи. Флаг . в L обозначает текущий каталог.