Это третья статья из серии о том, что такое процесс компиляции и как он работает, на примере языка C.

  1. Создание новых миров с помощью GNU Compiler Collection.
  2. Сила книги, или как использовать статические библиотеки на C.
  3. Динамические библиотеки на C: создание чего-то, на что будут полагаться другие. (эта статья)

***

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

Мы уже знаем, что механизм, который решает эту проблему в C, представляет собой библиотеку, а также мы знаем, что такое статические библиотеки. Итак, сегодня мы сосредоточимся на динамических библиотеках и ответим на следующие вопросы: что такое динамическая библиотека и чем она отличается от статической, как она работает, как создавать и как использовать Это.

0. Статический против динамического

Концепция библиотеки мощна, потому что она позволяет конечному пользователю связывать функции через свои объектные файлы во время выполнения или во время компиляции - это отличается в зависимости от типа библиотеки Ты творишь.

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

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

1. Как создать динамическую библиотеку

Чтобы продемонстрировать, как создать динамическую библиотеку, мы будем использовать кодовую базу проекта из предыдущей статьи:

Для начала нам нужно сначала создать объектные файлы с помощью команды gcc -fPIC -c *.c

Как вы заметили, на этот раз мы создали объектные файлы с флагом -fPIC. Этот флаг обозначает независимый от позиции код, характеристику, требуемую совместно используемыми библиотеками.

На следующем шаге мы создадим библиотеку с именем

gcc -shared -Wl,-soname,libtools.so -o libtools.so *.o

Клавиша -shared указывает компилятору создать общий объект, который затем можно связать с другими объектами для формирования исполняемого файла. Флаг -Wl передает параметры компоновщику в следующем формате -Wl,options, в нашем примере он устанавливает имя библиотеки, которое будет передано компоновщику.

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

2. Как использовать динамическую библиотеку

Из-за своего назначения наша библиотека должна быть динамически совместно используемой во время связывания с другими программами, и для этого мы добавили путь к библиотеке в переменную среды LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

В нашем примере это текущий рабочий каталог, и мы можем использовать . для добавления пути к нему. Теперь операционная система знает, где искать, если какая-то программа запросит функциональность у библиотеки. В качестве альтернативы для настройки динамических привязок времени выполнения компоновщика мы можем использовать команду ldconfig с флагами -n и -L.

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

gcc our_sources.c -L. -ltools -o resulted_program

где флаг -L указывает путь к библиотеке, в нашем случае это текущий каталог, а флаг -l указывает имя используемой библиотеки. Обратите внимание, что мы не предоставили префикс lib, а также расширение .so: они были разрешены компилятором.

Как видим, наша программа компилируется и выполняется.

3. Инструменты для работы с динамическими библиотеками

Если нам нужно узнать, какие функции есть в библиотеке, мы должны использовать команду nm:

nm libtools.so

Чтобы вывести список зависимостей библиотеки, следует использовать команду ldd:

Вот и все, ребята!

Резюме:

В этой статье мы напомнили причины, по которым существует такое понятие, как динамическая библиотека, чем она отличается от статической библиотеки, как она работает, как создавать и как использовать Это.