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

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

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

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

Как работают статические библиотеки?

Как упоминалось ранее, статические библиотеки используются при компиляции программы.

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

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

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

Вот список файлов в моем текущем каталоге. Я хочу создать библиотеку с файлами, заканчивающимися на .c. Файл, оканчивающийся на .h, является моим заголовочным файлом, в котором перечислены прототипы файлов .c.

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

После компиляции файлов .c теперь вы можете видеть, что есть дополнительные объектные файлы .o.

Теперь, когда у нас есть нужные объектные файлы, мы можем использовать команду ar для создания библиотеки libtest.a как таковой:

r — возможность замены старых объектных файлов новыми (если применимо); опция c указывает команде ar создать библиотеку, если она не существует. *.o указывает на создание библиотеки с использованием всех файлов с суффиксом .o (объектные файлы). Если вам не нужны все объектные файлы, вы можете указать их отдельно, например: ar rc libtest.a _print_rev.o _strlen.o _putchar.o

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

Примечание: если вам когда-нибудь понадобится обновить индекс библиотеки, снова запустите ranlib для библиотеки.

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

Теперь, когда у нас есть библиотека, как мы можем ее использовать?

  1. Мы должны быть уверены, что библиотека, которую мы используем, включена в нашу программу:
    Примечание: мы будем #including библиотекой <stdio.h> в main.c, поэтому мы можем использовать функцию printf.

  1. При компиляции мы должны включить библиотеку:
    Примечание:
    A. -L. указывает gcc искать библиотеку в текущем каталоге.
    B. Когда мы ссылаемся на библиотеку, мы удаляем lib и .a, но добавьте -l
    C. -o maintest говорит gcc назвать исполняемый файл maintest

Теперь у вас есть программа, готовая к запуску!

Знаете ли вы, что в C также есть библиотеки, известные как «динамические» или «разделяемые»?
Возможно, в будущем мы рассмотрим такой тип библиотек.