Это третья статья из серии о том, что такое процесс компиляции и как он работает, на примере языка C.
- Создание новых миров с помощью GNU Compiler Collection.
- Сила книги, или как использовать статические библиотеки на C.
- Динамические библиотеки на 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
:
Вот и все, ребята!
Резюме:
В этой статье мы напомнили причины, по которым существует такое понятие, как динамическая библиотека, чем она отличается от статической библиотеки, как она работает, как создавать и как использовать Это.