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

Стандартная библиотека C содержит макросы, определения типов и функции для таких задач, как обработка строк, математические вычисления, обработка ввода-вывода, управление памятью и ряд других служб операционной системы. [1]

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

Как они работают?

Когда программа C компилируется, компилятор генерирует объектный код. После генерации объектного кода компилятор также вызывает компоновщик. Одна из основных задач компоновщика — сделать код библиотечных функций (например, printf(), scanf(), sqrt() и т. д.) доступным для вашей программы. Компоновщик может выполнить эту задачу двумя способами: скопировав код библиотечной функции в ваш объектный код или предприняв некоторые меры, чтобы весь код библиотечной функции не копировался, а был доступен во время выполнения.[2]

- Статическая библиотека:

Является результатом того, что компоновщик копирует все используемые библиотечные функции в исполняемый файл. Статическая компоновка создает большие двоичные файлы и требует больше места на диске и в основной памяти. Примерами статических библиотек (библиотек, которые статически связаны) являются файлы .a в Linux и файлы .lib. в Windows. [2]

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

Динамическое связывание не требует копирования кода, это делается путем простого помещения имени библиотеки в двоичный файл. Фактическое связывание происходит при запуске программы, когда и бинарный файл, и библиотека находятся в памяти. Примеры динамических библиотек (библиотеки, которые подключаются во время выполнения): .so в Linux и .dll в винде. [2]

Как их создать? (Линукс)

- Статическая библиотека:

  1. Скомпилируйте или соберите исходные файлы, чтобы избежать ошибок и предупреждений, но не связывайте их. Расширение .c будет изменено на .o[3]

$ gcc -Wall -Werror -Wextra -pedantic -c *.c

2. Создайте статическую библиотеку. Этот шаг заключается в объединении нескольких объектных файлов в одну статическую библиотеку. [2]

$ ar -rc liball.a *.o

На выходе будет создана библиотека liball.a.

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

  1. Скомпилируйте или соберите исходные файлы, чтобы избежать ошибок и предупреждений, и создайте позиционно-независимый код, подходящий для динамической компоновки. [3]

$ gcc -Wall -Werror -Wextra -pedantic -fPIC -c *.c

2. Создать общий объект, который затем можно связать с другими объектами для формирования исполняемого файла. [3]

$ gcc -shared -o liball.so *.o

На выходе будет создана библиотека liball.so.

Как их использовать? (Линукс)

- Статическая библиотека:

  1. Скомпилируйте программу-драйвер.

$ gcc -c main.c -o main.o

2. Свяжите скомпилированную программу драйвера со статической библиотекой. Мы используем -L, чтобы сообщить, что статическая библиотека находится в текущей папке [2]

$ gcc -o основной main.o -L. -лалл

3. Беги

$ ./основной

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

  1. Скомпилируйте файл и сообщите, что библиотека находится в текущей папке.

gcc -Wall -pedantic -Werror -Wextra -L. main.c -lall -o main

2. Чтобы использовать библиотеку, которая находится в текущей папке, мы должны экспортировать LD_LIBRARY_PATH, которая является предопределенной переменной окружения в Linux/Unix, которая устанавливает путь, по которому компоновщик должен искать при связывании динамических библиотек/общих библиотек.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

3. Беги

./главный

Отличия, преимущества и недостатки

В данном случае меньше значит больше, поэтому я предпочитаю динамические библиотеки.

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

Означает: статическая библиотека. выполняются линкерами, общими библиотеками. операционной системой.

Размер. Размер статических библиотек гораздо больше, поскольку внешние программы встраиваются в исполняемый файл. dynamic имеют только одну копию динамической библиотеки, которая хранится в памяти.

Изменения во внешних файлах:исполняемый файл необходимо будет перекомпилировать, если какие-либо изменения были применены к внешним файлам. В общих библиотеках нет необходимости перекомпилировать исполняемый файл.

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

Совместимость:Статика никогда не имеет проблем с совместимостью, так как весь код находится в одном исполняемом модуле. Динамические программы зависят от наличия совместимой библиотеки. Зависимая программа не будет работать, если библиотека будет удалена из системы.

[4]

Библиография

Библиография

[1] https://en.wikipedia.org › вики › C_standard_library

[2] https://www.geeksforgeeks.org/static-vs-dynamic-libraries/

[4] https://www.geeksforgeeks.org/difference-between-static-and-shared-libraries/

[3] https://linux.die.net/man/1/gcc