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

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

Так как же они работают? И как вы его создаете?

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

Создание статической библиотеки

Чтобы создать статическую библиотеку, вы должны сначала иметь файлы c, которые мы можем преобразовать в объектные файлы. Здесь у нас есть 3 файла c с именами 1.c, 2.c и 3.c. Используя команду «gcc -c *.c», мы можем преобразовать все файлы c, как указано подстановочным знаком, который включает все файлы c, в объектные файлы 1.o, 2.o и 3.o.

Инструмент, который мы используем для создания библиотеки, называется ar для архиватора. Его можно использовать для создания статических библиотек, изменения объектных файлов в этой библиотеке и т. д. Мы используем команду «ar -rc testlib.a *o», чтобы заархивировать нашу библиотеку с именем «testlib.a» и включить все объектные файлы в каталог, указанный подстановочным знаком *.o. Флаг c говорит нам создать библиотеку, если она еще не существует, а флаг r говорит нам заменить старые объектные файлы новыми.

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

Чтобы увидеть содержимое созданной нами библиотеки, мы можем использовать команду «ar -t testlib.a». Здесь мы видим, что при использовании этой команды отображаются 3 объектных файла в нашей библиотеке.

Использование статической библиотеки

Чтобы использовать статическую библиотеку, мы должны вызвать ее как часть процесса компиляции и компоновки при создании нашей исполняемой программы. Мы можем использовать команду: gcc main.c -L. -ltestlib -o main, а затем: ./main.

Приведенная выше команда использует аргумент -l без префикса и расширения lib, и программа прикрепляет его обратно во время компиляции. Флаг -L указывает путь к каталогу. Когда мы запускаем исполняемую программу, используя ./main, мы можем связать статическую библиотеку. Таким образом, статическая библиотека не требуется во время выполнения, когда вы выполняете свою программу, и поэтому нет необходимости включать их при распространении вашего исполняемого файла. Связывание статической библиотеки более эффективно и ускоряет процесс, чем связывание отдельных исходных файлов.

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