C Academy · Урок

Статические и разделяемые библиотеки

Собирайте и связывайте библиотеки

Урок 4 из 413 шагов

«Статические и разделяемые библиотеки» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Условная компиляция
  2. Многофайловые проекты
  3. Makefile
  4. Статические и разделяемые библиотеки
← Назад к C Academy