Статические библиотеки

Использование общей библиотеки выполняется в два этапа:

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

Как их создать

  1. Статическая библиотека — это набор объектных файлов, которые были скопированы в один файл.

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;
}

Как их создать

  1. Создать объект

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) программы, использующие библиотеки, должны быть перекомпилированы для включения обновлений.

Преимущества общих библиотек

Динамические/общие библиотеки экономят место. Если бы библиотеки нельзя было загружать динамически, код был бы связан с каждой программой, которая в нем нуждалась, дублируя этот фрагмент кода по всей вашей системе. Это заняло бы место на диске и значительно усложнило бы обновление. Используя разделяемые библиотеки, функцию можно хранить в одной библиотеке, доступной для любой программы, которой необходимо ее использовать. Кроме того, необходимо обновить только одну копию библиотеки, если необходимо исправить ошибку. Общие библиотеки устраняют недостатки статических библиотек.