Статические библиотеки
Использование общей библиотеки выполняется в два этапа:
- Время компиляции — компоновщик сканирует разделяемую библиотеку во время сборки исполняемой программы, чтобы убедиться, что нет пропущенных символов. Он не будет реально брать объектные файлы из общей библиотеки и вставлять их в программу.
- Время выполнения — динамический загрузчик системы (процесс, отвечающий за автоматическую загрузку и привязку общих библиотек к работающему процессу), где можно найти нашу общую библиотеку.
Как их создать
- Статическая библиотека — это набор объектных файлов, которые были скопированы в один файл.
gcc -Wall -Werror -Wextra -pedantic -c *.c
-c
flags не запускает ссылку, тогда вывод состоит из объектных файлов, выводимых ассемблером.
2. Заархивируйте объектные файлы
ar rc libutil.a util_file.o util_net.o util_math.o
'ar'
означает «архиватор». Эту программу можно использовать для создания статических библиотек (которые на самом деле являются архивными файлами), изменения объектных файлов в статической библиотеке, перечисления имен объектных файлов в библиотеке и т. д. Чтобы создать статическую библиотеку, мы можем использовать такую команду:
Флаг 'c'
указывает ar создать библиотеку, если она не существует. Флаг 'r'
заменяет старые объектные файлы в библиотеке новыми объектными файлами.
Как их использовать
gcc main.0 -L -lutil -o prog
Компоновщик будет искать файл libutil.so и связывать его с программой, используя флаг -L.
.
Динамические библиотеки
Примеры файлов
foo.c
#include <stdio.h> void foo(void) { printf("Shared Library\n"); }
foo.h
#ifndef foo_h__ #define foo_h__ extern void foo(void); #endif // foo_h__
main.c
#include <stdio.h> #include "foo.h" int main(void) { printf("This is a test\n"); foo(); return 0; }
Как их создать
- Создать объект
gcc -fPIC -Wall -Werror -Wextra -pedantic -c foo.c
Флаги -c
flags генерируют объектные файлы.
Используйте -fPIC
-fPIC или -fpic для генерации кода.
Примечание: флаг -fPIC работает всегда, но код продукта больше, чем -fpic. Хотя код продукта -fpic меньше, он может иметь ограничения, зависящие от платформы.
2. Создайте библиотеку
gcc -shared -o libfoo.so foo.o
Создает библиотеки libfoo.so из объектного файла
Обратите внимание, что флаг -shared
создает общий объект, который затем может быть связан с другими объектами для формирования исполняемого файла.
Как использовать
Компоновщик не знает, где находится разделяемая библиотека, поэтому, чтобы сообщить компоновщику, где найти библиотеку, вам нужно сделать это с флагом -L
.
$ gcc -L/home/username/librarydirectory -Wall -o test main.c -lfoo $ ./test This is a test Shared Library
если вы не используете флаг -L
, вы, скорее всего, получите ошибку:
error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory
Кроме того, вы можете настроить LD_LIBRARY_PATH
export LD_LIBRARY_PATH=home/username/librarydirectory
Теперь вы можете просто запустить ./test
$ ./test This is a test Shared Library
Недостатки статических библиотек
Проблема со статической компоновкой: (1) все функции будут включены как исполняемый файл, поэтому размер увеличится. (2) программы, использующие библиотеки, должны быть перекомпилированы для включения обновлений.
Преимущества общих библиотек
Динамические/общие библиотеки экономят место. Если бы библиотеки нельзя было загружать динамически, код был бы связан с каждой программой, которая в нем нуждалась, дублируя этот фрагмент кода по всей вашей системе. Это заняло бы место на диске и значительно усложнило бы обновление. Используя разделяемые библиотеки, функцию можно хранить в одной библиотеке, доступной для любой программы, которой необходимо ее использовать. Кроме того, необходимо обновить только одну копию библиотеки, если необходимо исправить ошибку. Общие библиотеки устраняют недостатки статических библиотек.