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

Когда мы выполняем код на языке 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$