Зачем использовать библиотеки?
Стандартная библиотека C содержит макросы, определения типов и функции для таких задач, как обработка строк, математические вычисления, обработка ввода-вывода, управление памятью и ряд других служб операционной системы. [1]
Но также полезно создавать собственные библиотеки, потому что при повторном использовании ваших функций вы значительно экономите время на разработку и делаете свой код переносимым.
Как они работают?
Когда программа C компилируется, компилятор генерирует объектный код. После генерации объектного кода компилятор также вызывает компоновщик. Одна из основных задач компоновщика — сделать код библиотечных функций (например, printf(), scanf(), sqrt() и т. д.) доступным для вашей программы. Компоновщик может выполнить эту задачу двумя способами: скопировав код библиотечной функции в ваш объектный код или предприняв некоторые меры, чтобы весь код библиотечной функции не копировался, а был доступен во время выполнения.[2]
- Статическая библиотека:
Является результатом того, что компоновщик копирует все используемые библиотечные функции в исполняемый файл. Статическая компоновка создает большие двоичные файлы и требует больше места на диске и в основной памяти. Примерами статических библиотек (библиотек, которые статически связаны) являются файлы .a в Linux и файлы .lib. в Windows. [2]
- Динамическая библиотека:
Динамическое связывание не требует копирования кода, это делается путем простого помещения имени библиотеки в двоичный файл. Фактическое связывание происходит при запуске программы, когда и бинарный файл, и библиотека находятся в памяти. Примеры динамических библиотек (библиотеки, которые подключаются во время выполнения): .so в Linux и .dll в винде. [2]
Как их создать? (Линукс)
- Статическая библиотека:
- Скомпилируйте или соберите исходные файлы, чтобы избежать ошибок и предупреждений, но не связывайте их. Расширение .c будет изменено на .o[3]
$ gcc -Wall -Werror -Wextra -pedantic -c *.c
2. Создайте статическую библиотеку. Этот шаг заключается в объединении нескольких объектных файлов в одну статическую библиотеку. [2]
$ ar -rc liball.a *.o
На выходе будет создана библиотека liball.a.
- Динамическая библиотека:
- Скомпилируйте или соберите исходные файлы, чтобы избежать ошибок и предупреждений, и создайте позиционно-независимый код, подходящий для динамической компоновки. [3]
$ gcc -Wall -Werror -Wextra -pedantic -fPIC -c *.c
2. Создать общий объект, который затем можно связать с другими объектами для формирования исполняемого файла. [3]
$ gcc -shared -o liball.so *.o
На выходе будет создана библиотека liball.so.
Как их использовать? (Линукс)
- Статическая библиотека:
- Скомпилируйте программу-драйвер.
$ gcc -c main.c -o main.o
2. Свяжите скомпилированную программу драйвера со статической библиотекой. Мы используем -L, чтобы сообщить, что статическая библиотека находится в текущей папке [2]
$ gcc -o основной main.o -L. -лалл
3. Беги
$ ./основной
- Динамическая библиотека:
- Скомпилируйте файл и сообщите, что библиотека находится в текущей папке.
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/