Статические и разделяемые библиотеки
Собирайте и связывайте библиотеки
«Статические и разделяемые библиотеки» — бесплатный урок C Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.
Что такое библиотека
Библиотека — это набор скомпилированных объектных файлов, которые можно повторно использовать в разных программах, не компилируя исходный код каждый раз.
В C есть два вида библиотек:
- Статические библиотеки (
.a), код которых копируется в исполняемый файл во время компоновки - Динамические библиотеки (
.so), загружаемые во время выполнения
Сборка объектных файлов
Оба вида библиотек начинаются с объектных файлов. Скомпилируйте исходные файлы с помощью -c, как обычно.
Эти файлы .o являются исходным материалом, который архиватор или компоновщик объединит в библиотеку.
gcc -c mathlib.c -o mathlib.o
gcc -c strlib.c -o strlib.oСоздание статической библиотеки
Архиватор ar объединяет объектные файлы в архив .a. По соглашению он называется lib<name>.a.
Флаги означают следующее: r — добавить или заменить, c — создать при необходимости, s — записать индекс.
ar rcs libmymath.a mathlib.o strlib.oКомпоновка со статической библиотекой
Используйте -L для указания каталога поиска и -l для указания имени библиотеки (уберите префикс lib и суффикс .a).
Необходимый код копируется в исполняемый файл, после чего тот работает самостоятельно.
gcc main.c -L. -lmymath -o appОсобенности статических библиотек
Статическая компоновка проста и не требует внешних зависимостей:
- Исполняемый файл содержит всё необходимое и не имеет зависимости во время выполнения
- Но копия библиотеки в каждой программе увеличивает размер исполняемых файлов
- Для исправления ошибки в библиотеке необходимо заново скомпоновать каждую использующую её программу
Позиционно-независимый код
Динамические библиотеки могут загружаться по любому адресу в памяти, поэтому их код должен быть позиционно-независимым. Компилируйте его с флагом -fPIC.
Так создаётся код, использующий относительную адресацию вместо фиксированных адресов.
gcc -fPIC -c mathlib.c -o mathlib.o
gcc -fPIC -c strlib.c -o strlib.oСоздание динамической библиотеки
Создайте файл .so с помощью -shared. По соглашению он называется lib<name>.so.
В отличие от статического архива, это полноценный скомпонованный объект, который загрузчик может отобразить в память во время выполнения.
gcc -shared mathlib.o strlib.o -o libmymath.soКомпоновка с динамической библиотекой
Компоновка выглядит так же, как в случае статической библиотеки. Разница в том, что код не копируется в исполняемый файл — записывается только ссылка.
Исполняемый файл остаётся небольшим, но теперь зависит от возможности найти libmymath.so во время выполнения.
gcc main.c -L. -lmymath -o appПоиск библиотеки во время выполнения
При запуске динамический загрузчик ищет файл .so в стандартных каталогах. Библиотека в текущем каталоге в этот список не входит.
Для тестирования укажите загрузчику путь к ней с помощью LD_LIBRARY_PATH (Linux).
LD_LIBRARY_PATH=. ./appОсобенности динамических библиотек
Динамические библиотеки жертвуют простотой ради гибкости:
- Одна копия в памяти используется несколькими программами, что экономит RAM и место на диске
- Исправление ошибки в
.soприносит пользу всем программам без повторной компоновки - Но программа не запустится, если файл
.soотсутствует или несовместим
Этот последний риск обычно называют «адом зависимостей».
Проверка зависимостей
Два инструмента помогают узнать, с какими библиотеками связан двоичный файл:
ldd appвыводит список динамических библиотек, которые понадобятся загрузчику во время выполненияnm libmymath.aвыводит список символов (функций) внутри библиотеки
Если ldd показывает «not found», загрузчик не может найти файл .so в путях поиска.
ldd app
nm libmymath.aБыстрая проверка
Сопоставьте флаг с целью.
Итоги
Теперь Вы умеете собирать и компоновать оба вида библиотек:
- Статические:
ar rcs libX.a *.o; код копируется в двоичный файл, который получается автономным, но более крупным - Динамические: компилируются с
-fPIC, создаются с-shared, а код загружается во время выполнения - Оба вида подключаются с помощью
-Lи-l; динамическим библиотекам нужен путь поиска во время выполнения, напримерLD_LIBRARY_PATH
Теперь Вы освоили всю цепочку инструментов — от препроцессора до сборки.
Изучай C с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 39
- Уроки
- 144
Часто задаваемые вопросы
Урок «Статические и разделяемые библиотеки» бесплатный?
Да — полный текст урока «Статические и разделяемые библиотеки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.
Чему я научусь в уроке «Статические и разделяемые библиотеки»?
Собирайте и связывайте библиотеки Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C Academy?
Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Статические и разделяемые библиотеки»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C Academy?
Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Условная компиляция
- Многофайловые проекты
- Makefile
- Статические и разделяемые библиотеки