Зачем использовать библиотеки
Когда мы выполняем код на языке C, нам нужна какая-то функция, например, puts (печать символов и строк), atoi (преобразование строки в целое число) или isdigit (проверка цифры [0–9]). У вас есть заголовок (стандартная библиотека), которому вы разрешаете использовать эти функции.
Эти стандартные библиотеки заголовков находятся в каталогах:
/usr/local/include
/usr/include
Имея возможность включать эти библиотеки с определениями различных функций, мы можем сэкономить много вещей, представьте, например, что каждый раз, когда нам нужно читать с клавиатуры, мы должны затем создать функцию, которая делает (что-то действительно сложное), чтобы библиотеки в C мы можем использовать широкий спектр функций, которые облегчат нашу жизнь и повысят модульность наших кодов.
Библиотеки — это не только внешние файлы, созданные другими, также можно создавать собственные библиотеки и использовать их в своих программах. Библиотеки могут иметь несколько различных расширений, наиболее распространенными являются: . либ, . бпл, . а, . dll, . час
Как они работают?
В Linux мы можем создавать два типа библиотек: статические и динамические.
Статическая библиотека — это библиотека, которая "копируется" в нашу программу при ее компиляции. Когда у нас есть исполняемый файл нашей программы, библиотека бесполезна (то есть она служит для других будущих проектов). Мы могли бы удалить его, и наша программа все равно работала бы, так как в ней есть копия всего, что вам нужно. Копируется только та часть библиотеки, которая необходима. Например, если в библиотеке есть две функции, а наша программа вызывает только одну, копируется только эта функция.
Динамическая библиотека НЕ копируется в нашу программу при компиляции. Когда у нас есть исполняемый файл и мы его запускаем, каждый раз, когда коду нужно что-то из библиотеки, он будет обращаться к этому. Если мы удалим библиотеку, наша программа выдаст ошибку, что не находит ее.
Как создать статическую библиотеку
Мы увидим, как создается статическая библиотека с помощью компилятора GCC.
Получив наш код, чтобы получить статическую библиотеку, мы должны выполнить следующие шаги:
- Получите объектные файлы (.o) из всех наших источников (.c). Мы компилируем с кодом cc -c файл. c -o файл.o.
Параметр -c указывает компилятору не создавать исполняемый файл, а только объектный файл. Также вы можете использовать gcc.
Для создания библиотеки (.a). Для этого используем команду ar со следующими параметрами:
ar -rc libholberton.a file1.o file2.o ...
Флаг -r указывает команде ar вставить (или заменить, если они уже находятся внутри) объектные файлы в библиотеке. Флаг -c указывает ar создать библиотеку, если она еще не существует. Ниже приведены все объектные файлы, которые нам нужны. ar на самом деле гораздо более общая команда, чем все это, и служит для упаковки файлов любого типа (не только объектных файлов). У вас также есть возможность увидеть, какие файлы находятся внутри, удалить некоторые из них, заменить их и т. д.
ar -t libholberton.a
Флаг -t показывает объектные файлы, созданные в библиотеке.
Команда ranlib, используемая для создания или обновления индекса, называется 'ranlib'
и вызывается следующим образом:
ranlib libholberton.a
Как использовать статические библиотеки
В этом примере мы собираемся использовать код is_a_digit для понимания:
ubuntu@ip-172-31-63-244:~/holbertonschool$ cat main.c
void is_a_digit(void);
int main(void)
{
is_a_digit();
return (0);
}
В этом коде есть сообщение об ошибке в функции main, потому что у этого компилятора нет библиотеки, и код дает сбой.
ubuntu@ip-172-31-63-244:~/holbertonschool$ gcc main.c
/tmp/ccQa2r6L.o: In function `main':
main.c:(.text+0x5): undefined reference to `is_a_digit'
collect2: error: ld returned 1 exit status
Часть компиляции проста. Делается почти так же, как и при линковке со статическими библиотеками:
Обратите также внимание на использование флага '-L'
— этот флаг сообщает компоновщику, что библиотеки могут быть найдены в заданном каталоге ('.', ссылающемся на текущий каталог), в дополнение к стандартным расположениям, в которых компилятор ищет системные библиотеки.
Компоновщик будет искать файл libholberton.a (-lholbertonschool
) в текущем каталоге (-L.
) и связывать его с программой.
ubuntu@ip-172-31-63-244:~/holbertonschool$ gcc main.c -L. -lholbertonschool -o isadigit
Наконец, компилятор генерирует исполняемый файл ./isadigit без ошибок и показывает результат работы программы.
ubuntu@ip-172-31-63-244:~/holbertonschool$ ./isadigit
1 is a digit
ubuntu@ip-172-31-63-244:~/holbertonschool$