Прежде чем приступить к описанию основных различий между статическими и динамическими библиотеками, давайте сначала определим библиотеку: библиотека — это набор предварительно обработанных функций, хранящихся в формате объектного кода в готовой к использованию форме. Эти библиотеки включаются в начало нашего кода или более известны как заголовочные файлы, например, #include ‹stdio.h›.
Чтобы получить представление о библиотеке в целом, важно понимать каждую часть цикла программы:
Во-первых, программа пишется с помощью редактора в виде текстового файла, эта программа может использовать другие программы или библиотеки, эти библиотеки объединяются с программой, чтобы мы могли ее выполнить.
Однако перед выполнением программы ее необходимо скомпилировать, чтобы преобразовать текстовый файл в объектный файл, который машина сможет понять и выполнить. Во время компиляции программы выполняется процесс компоновки, а то, что происходит во время компоновки, представляет собой процесс объединения внешних программ, необходимых написанной для ее успешного выполнения, и является лишь последним шагом в компиляции программы.
Зачем использовать библиотеки?
Зная все предыдущее, легко понять, почему так эффективно использовать библиотеки в наших программах. Функции, содержащиеся в библиотеке или заголовочном файле, объявляются как прототипы функций, поэтому при этом ссылаются на реальные объектные файлы, в которых хранятся функции и откуда они вставляются или вызываются в нашей исполняемой программе.
Теперь типы библиотек определяются тем, как они названы, имя файла библиотеки всегда начинается с lib, за которым следует их имя, и, наконец, заканчивается двумя способами:
- .a для статических библиотек.
- .so для общих библиотек.
Как создать статическую библиотеку
Выполните следующие шаги, чтобы создать нашу собственную статическую библиотеку:
- Создайте файл C или несколько файлов C, содержащих функцию: в этом примере я буду использовать простую функцию _strlen.c, которая возвращает количество символов в строке.
2. Создайте заголовочный файл в том же каталоге, где вы будете писать прототипы функций или вашу функцию или функции: например, я назову его holberton.h и включу защиту заголовков.
3. Скомпилируйте вашу программу или все ваши файлы .c:
Я использую компилятор de C с опцией -c, чтобы не дать компилятору создать полную программу и получить только файл объектного кода («.o»).
4. Используйте команду ar, чтобы взять все созданные объектные файлы и объединить их в один файл с опцией rc.
Создаваемая библиотека называется libholberton.a, параметр r используется для добавления или замены старых файлов, когда это необходимо, а параметр c используется для создать архив.
После создания или изменения архива его необходимо проиндексировать. Позже этот индекс используется компилятором для ускорения поиска символов внутри библиотеки, а команда, используемая для создания или обновления индекса, называется ranlib. Однако в некоторых системах архиватор (не всегда ar) уже позаботится об индексе, поэтому ranlib не нужен.
Как создать динамическую библиотеку
Выполните следующие шаги, чтобы создать нашу собственную динамическую библиотеку:
- Как и в статических библиотеках, создайте файл C, содержащий функцию:
2. Так же, как и раньше, создайте заголовочный файл для библиотеки прототипа функции и других функций:
3. Скомпилируйте файлы .c, чтобы получить объектные файлы для библиотеки:
Как и раньше, я использую флаг -c, чтобы не дать компилятору создать полную программу и получить только файл объектного кода («.o»). Флаг -fPIC означает «Позиционно-независимый код», что означает, что генерирует позиционно-независимый код, это необходимо, потому что код не должен зависеть от того, находится ли он по определенному адресу, чтобы работать с ним во многих программах.
4. Создайте динамическую библиотеку и включите в нее все ранее скомпилированные файлы объектного кода:
Библиотека называлась libholberton.so, и использовался флаг -shared, то есть опция компоновщика, которая создает общий объект, который затем может быть связан с другими объектами для формирования исполняемый.
Кроме того, если вы используете nm -D libholberton.so, вы можете увидеть всю таблицу символов, связанную с каждым объектом.
5. Экспортируйте расположение библиотеки в переменную окружения:
LD_LIBRARY_PATH — это переменная среды пути поиска для общей библиотеки Linux.
Как использовать библиотеки:
Использование обеих библиотек очень похоже:
1. Скомпилируйте свою программу с общей или статической библиотекой:
Флаг -L указывает путь к библиотеке, в данном случае мы просто ставим . (точка), потому что наша библиотека находится в текущем рабочем каталоге.
Обратите внимание: если вы введете ldd, а затем исполняемый файл, вы получите зависимости динамической библиотеки:
7. Запустите вашу программу:
Примечание: вы знаете, как система узнает, где найти каждую библиотеку?
Здесь используется ldconfig. Это создает необходимые ссылки и кеширует самые последние общие библиотеки, найденные в доверенных каталогах.
Различия между статической и динамической библиотекой
Каковы преимущества и недостатки каждого из них?
Использование статических библиотек дает определенные преимущества, некоторые из них:
- Вы можете перенести свою программу на другой компьютер, и она будет выполняться нормально. Это портативно!
- Если вы внесете изменения в статическую библиотеку, это не повлияет на исполняемый файл. Это делает статические библиотеки хорошим вариантом, когда ваши программы не такие большие и простые.
Однако в этих библиотеках есть и некоторые недостатки:
- Все объекты находятся в исполняемом файле, что делает его довольно большим, особенно если вы хотите добавлять все больше и больше функций. Поэтому, если программа усложняется, это может быть не лучшая библиотека для использования.
- Если код библиотеки обновляется, программисту приходится перекомпилировать программу в новый исполняемый файл.
С другой стороны, преимущества использования динамических библиотек:
- Ему нужна только одна копия во время выполнения. Эта возможность делает ее гибкой библиотекой, которую можно использовать в нескольких программах без необходимости иметь собственную копию каждого файла.
- Если библиотека обновлена, исполняемые файлы не нужно перекомпилировать заново.
Но также хорошо иметь в виду недостатки такого рода библиотек:
- Это зависит от библиотеки, например, если библиотека будет удалена, исполняемый файл не будет работать.
- Опять же, если в библиотеке возникает проблема, например, повреждение, исполняемый файл не может работать.