работа со статическими библиотеками в c

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

Тут на помощь приходят библиотеки.

Библиотека — это файл, содержащий версии объектных файлов функций для проекта в одном удобном маленьком пакете. Вместо того, чтобы делать что-то вроде этого:

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

Хотя для C существует два разных типа библиотек (статические и динамические/общие), в этой статье будет рассмотрен один из двух — статические библиотеки.

зачем использовать библиотеки?

«Но файлов заголовков достаточно!» ты говоришь. «Я могу просто сослаться на все свои функции в шапке и сделать ссылку оттуда!»

Но что произойдет, если у вас есть программа с пятьюдесятью, сотней, сотнями функций?

Библиотеки.

Там, где раньше были сотни файлов, теперь есть одна (или, может быть, две или три) библиотеки.

как это сделать?

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

сборник, часть 1

Чтобы создать библиотеку функций, сначала нам понадобится полная ими папка.

jack@ubuntu:~/0x08-static_libraries$ ls *.c
0-isupper.c  0-strcat.c  1-isdigit.c  1-strncat.c  2-strlen.c   3-islower.c  3-strcmp.c  4-isalpha.c  5-strstr.c  9-strcpy.c  _putchar.c
0-memset.c   100-atoi.c  1-memcpy.c   2-strchr.c   2-strncpy.c  3-puts.c     3-strspn.c  4-strpbrk.c  6-abs.c

Затем мы запускаем gcc с флагом -c.

gcc -c *.c

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

архивирование

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

ar -rc libmylib.a *.o

Чтобы ускорить работу (и уменьшить вероятность ошибок), вы можете использовать *.o для сбора всех файлов .o в текущем каталоге.

индексация

Индексирование организует библиотеку для выполнения двух задач: ускорения поиска символов и обеспечения того, чтобы порядок символов не влиял на компиляцию. Мы можем использовать флаг -s команды ar или использовать команду ranlib для индексации нашего архива.

ar -s libmylib.a
ranlib libmylib.a

компиляция, ч. 2

Чтобы использовать нашу библиотеку в программе, нам просто нужно включить ее в окончательную компиляцию с помощью gcc.

gcc main.c -L. lmylib

Флаг -L указывает gcc искать в каталоге — здесь мы обозначили текущий рабочий каталог с помощью «.».

Вы заметите странный формат имени файла. Когда вы используете «l», за которым следует имя библиотеки, с удаленным префиксом «lib» и расширением «.a», gcc автоматически добавит удаленные части обратно при поиске. Важно отметить, что динамические библиотеки имеют преимущество перед статическими, поэтому, если у вас есть динамическая библиотека с тем же именем, что и у статической библиотеки, динамический файл будет включенным.

погружение в нашу новую библиотеку

Ввод nm libmylib.a в стандартный ввод вашей консоли теперь покажет вам, что находится внутри вашей библиотеки. ar -t libmylib.a также покажет вам те же файлы.

Надеюсь, вы немного узнали о статических библиотеках на C и о том, почему они являются необходимым инструментом, который должен быть у любого программиста.