ПОЧЕМУ МЫ ИСПОЛЬЗУЕМ БИБЛИОТЕКИ?

Библиотеки полезны при кодировании, поскольку они позволяют программистам использовать одну и ту же функцию в нескольких программах без необходимости переписывать ее каждый раз, когда они хотят ее использовать.

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

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

КАК СОЗДАТЬ БИБЛИОТЕКУ

Статический

Шаг 0. В этих инструкциях показано, как создавать библиотеки со всеми файлами, оканчивающимися на «.c», в вашем рабочем каталоге.

$ ls
_abs.c

Шаг 1. Скомпилируйте исходный код всех файлов в текущем каталоге, которые заканчиваются на «.c».

$ gcc -c *.c

вариант gcc:

  • -c: скомпилировать и собрать исходный код, но не компоновать (т.е. создавать объектные файлы)

Шаг 2. Создайте статическую библиотеку из всех файлов «.o» с помощью команды ar.

$ ar rc libmylibrary.a *.o

варианты:

  • -r: если применимо, заменить старые объектные файлы новыми.
  • -c: создать библиотеку, если она не существует

Шаг 3. Создайте индекс для библиотеки с помощью команды ranlib

$ ranlib libmylibrary.a

Созданный указатель будет действовать как оглавление библиотеки.

Динамический

Шаг 0.То же, что и Шаг 0 при создании статической библиотеки.

Шаг 1. Скомпилируйте исходный код всех файлов в текущем каталоге, заканчивающихся на «.c», в PIC

$ gcc -c -fpic *.c

параметры gcc:

  • -c: скомпилировать и собрать исходный код, но не компоновать (т.е. создавать объектные файлы)
  • -fpic: делает позиционно-независимый код (PIC), требуемый для динамических библиотек

Шаг 2. Создайте динамическую библиотеку из всех объектных файлов в текущем каталоге.

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

параметры gcc:

  • -shared: разрешить связывание общего объекта, требуется для динамических библиотек
  • -o: имя исполняемого файла libmylibrary.so

Примечание: разделяемые библиотеки заканчиваются на .so

Ваша общая библиотека создана!

$ ls
_abs.c _abs.o libmylibrary.so mylibrary.h

КАК ПОЛЬЗОВАТЬСЯ БИБЛИОТЕКОЙ

Только динамические

Чтобы сделать динамические библиотеки в вашем текущем каталоге доступными во время выполнения, можно использовать переменную среды LD_LIBRARY_PATH.

Для этого экспортируйте переменную с помощью:

$ export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

Как статические, так и динамические

Убедитесь, что ваша программа ссылается на вашу библиотеку, например:

$ cat main.c
#include “mylibrary.h”
#include <stdio.h>
/**
*
* main — check _abs
*
* Return: Always 0
*/
int main(void)
{
printf(“\n%d\n”, _abs(-100));
return (0);
}

Скомпилируйте свою программу с помощью gcc -L. main.c -lmylibrary -o abs

параметры gcc:

  • -L: просмотреть общие библиотеки, на которые ссылаются, которые находятся в текущем каталоге.
  • -o: назвать исполняемый файл «abs»

Примечание: когда вы ссылаетесь на библиотеку, вы опускаете префикс «lib» и суффикс «.a» или «.so» и добавляете префикс «-l».

Теперь вы можете просто запустить исполняемый файл!

$ ./abs
100

МЫ МОЖЕМ ИХ СДЕЛАТЬ, НО КАК ОНИ РАБОТАЮТ?

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

При компиляции исходного кода со статической библиотекой ассемблер создает объектный код и передает его компоновщику. Затем компоновщик просматривает объектный код программы, и всякий раз, когда вызывается функция, ее объектный код копируется из статической библиотеки в объектный код программы, а затем создает исполняемый файл.

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

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

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

ПЛЮСЫ КАЖДОГО

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

Если библиотека удалена, все программы, использующие библиотеку, могут работать.

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

Динамическое связывание

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

Функции в разделяемых библиотеках можно обновлять без необходимости перекомпилировать программы, ссылающиеся на библиотеку.

МИНУСЫ КАЖДОГО

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

Благодаря включению кодов объектов функций в исполняемые файлы, а не только ссылку, файлы становятся больше.

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

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

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

Если вы удалите библиотеку, никакие программы, ссылающиеся на эту программу, не смогут работать.

КОТОРЫЙ Я ИСПОЛЬЗУЮ?

Все зависит от того, чего вы пытаетесь достичь! Попробуйте создать как статические, так и динамические библиотеки и посмотрите, что вам подходит. :)

ССЫЛКИ:

  1. http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
  2. http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html
  3. http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
  4. https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html
  5. http://docencia.ac.upc.edu/FIB/USO/Bibliografia/unix-c-libraries.html#what_is_a_library