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

double sin(double x);
double cos(double x);
double tan(double x);

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

Динамические и статические библиотеки

Статическая библиотека — это библиотека, которая компилируется вместе с вашим исполняемым файлом приложения. В этом подходе есть плюсы и минусы. Недостатком является вариант использования, когда вы интегрируете много библиотек. Это может увеличить размер вашего исполняемого файла. Однако преимущество заключается в том, что оно является автономным, и конечному пользователю не придется устанавливать какие-либо библиотеки, если у них их нет, потому что они поставляются в комплекте с приложением. С другой стороны, динамические библиотеки загружаются во время выполнения, что делает ваше приложение более легким. Однако, как упоминалось ранее, если на компьютере конечного пользователя не установлены библиотеки, ему придется найти способ их установить, что иногда является нетривиальной задачей. В данном конкретном случае мы сосредоточимся на статических библиотеках на языке программирования C.

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

Динамическую библиотеку можно определить по ее .soрасширению, такому как libholberton.so. Этот файл содержит набор символических ссылок. Например, чтобы создать статическую библиотеку для следующих файлов C:

0-isupper.c
0-memset.c
0-strcat.c
1-isdigit.c
1-memcpy.c
1-strncat.c
100-atoi.c
2-strchr.c
2-strlen.c
2-strncpy.c
3-islower.c
3-puts.c
3-strcmp.c
3-strspn.c
4-isalpha.c
4-strpbrk.c
5-strstr.c
6-abs.c
9-strcpy.c
_putchar.c

Сначала вы должны создать заголовочный файл holberton.h, который содержит прототипы функций в файлах, содержащих следующее:

#ifndef HOLBERTON_H
#define HOLBERTON_H 
#define EXIT_SUCCESS 0 
int _putchar(char c);
int _islower(int c);
int _isalpha(int c);
int _abs(int n);
int _isupper(int c);
int _isdigit(int c);
int _strlen(char *s);
void _puts(char *s);
char *_strcpy(char *dest, char *src);
int _atoi(char *s);
char *_strcat(char *dest, char *src);
char *_strncat(char *dest, char *src, int n);
char *_strncpy(char *dest, char *src, int n);
int _strcmp(char *s1, char *s2);
char *_memset(char *s, char b, unsigned int n);
char *_memcpy(char *dest, char *src, unsigned int n);
char *_strchr(char *s, char c);
unsigned int _strspn(char *s, char *accept);
char *_strpbrk(char *s, char *accept);
char *_strstr(char *haystack, char *needle); 
#endif

Затем вы должны запустить следующую команду:

$ gcc -Wall -shared -fPIC *.c -o libholberton.so

Это создаст файл libholberton.so, содержащий набор символических ссылок на все эти файлы. Если вы хотите увидеть, что содержится в вашей динамической библиотеке, введите команду:

$ nm -D libholberton.so

Это приведет к такому результату:

0000000000001161 T _abs
0000000000000af6 T _atoi
0000000000202040 B __bss_start
                 w __cxa_finalize
0000000000202040 D _edata
0000000000202048 B _end
000000000000120c T _fini
                 w __gmon_start__
00000000000008b0 T _init
0000000000000fd8 T _isalpha
0000000000000bbf T _isdigit
0000000000000dd2 T _islower
0000000000000a05 T _isupper
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 w _Jv_RegisterClasses
0000000000000be0 T _memcpy
0000000000000a26 T _memset
00000000000011e7 T _putchar
0000000000000df3 T _puts
0000000000000a61 T _strcat
0000000000000cbb T _strchr
0000000000000e46 T _strcmp
0000000000001185 T _strcpy
0000000000000d29 T _strlen
0000000000000c23 T _strncat
0000000000000d57 T _strncpy
000000000000100c T _strpbrk
0000000000000f38 T _strspn
0000000000001094 T _strstr
                 U write

Теперь мы компилируем нашу программу main.c и добавляем нашу динамическую библиотеку.

$ gcc -Wall -pedantic -Werror -Wextra -L. main.c -lholberton -o main

Затем мы добавляем путь к нашей общей библиотеке в среду:

$ export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

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

$ ./main