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

Почему:библиотека — это набор предварительно скомпилированных фрагментов кода или объектных файлов с расширением '.o'. linux с помощью компилятора gcc. Библиотека упрощает работу, позволяя использовать полезные функции, подпрограммы, классы, структуры данных и т. д., которые можно повторно использовать в исполняемой программе. Эта концепция позволяет конечному пользователю связывать функции во время выполнения или во время компиляции. В зависимости от типа создаваемой вами библиотеки.

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

Создание библиотек (только для Linux)

Мы будем использовать в качестве примера файл «function.c». В обоих случаях нам нужно сначала создать объектный файл.

Для статики параметр «-c» гарантирует, что процесс компиляции остановится до компоновщика, и создаст файл «function.o».

Для динамических библиотек мы используем дополнительный флаг: ‘-fPIC’ или ‘-fpic’ (Position Independent Code). PIC — это код, который работает независимо от того, где он находится в памяти. Это позволяет разным программам использовать одну и ту же общую библиотеку, у библиотеки будут разные адреса в памяти для каждой программы. И мы по-прежнему хотим, чтобы наши программы имели доступ к коду, где бы он ни хранился.

Следующий шаг — создать библиотеку «libholberton» с нашим объектным файлом. Следующее:

В первом случае мы используем команду ar для создания файла '.a' (расшифровывается как архив), а во втором случае мы используем gcc с флагами '-shared'(общий объект, который затем может быть связан с другими объектами для формирования исполняемого файла). Флаг -wl задает имя библиотеки, а '-o', поскольку мы компилируем из объектного файла, для создания '.so' файл (как и для общего объекта).

Использование: Теперь, когда у нас есть библиотека, мы должны использовать ее для компиляции и создания нашей программы. Допустим, наша точка входа находится в файле «main.c», и мы хотим назвать исполняемую программу «output». Далее идет команда для компиляции программы с нашей библиотекой в ​​обоих случаях:

Флаг '-L' сообщает компилятору, где искать библиотеку, поэтому в этом случае, когда библиотека находится в текущем рабочем каталоге, мы просто используем точку. ‘-llibholberton’ указывает компилятору связать код в main.c с кодом в библиотеке «libholberton». Наконец, флаг '-o' позволяет нам дать имя исполняемому файлу, в этом случае это будет «выход».

Со статической библиотекой мы можем просто запустить код прямо сейчас. Но с динамической библиотекой это не сработает. Полезным инструментом для демонстрации этого является ldd, команда, которая печатает зависимости общих библиотек. В нашем случае вывод «ldd output» будет содержать строку, которая гласит: libholberton.so => ​​not found.

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

Когда снова попробуете «ldd output», вывод будет таким: libholberton.so =› ./libholberton.so (0x00007fd4bf2d9000)

Помимо ldd для зависимостей, мы можем использовать команду 'nm' для проверкисимволов динамической библиотеки. Эти символы включают функции, определенные в библиотеке. Для динамических библиотек мы используем флаг -D, например: $ nm -D libholberton.so.

Хорошо, теперь, когда мы уверены, что динамическая библиотека создана и ее можно использовать, мы можем запустить нашу программу, набрав «./output» в нашей командной строке.

Плюсы и минусы двух типов библиотек

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

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

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

Вывод

Хотя это может быть не самый увлекательный предмет в компьютерных науках, люди, которые программируют на C, должны знать инструменты и методы, о которых мы говорили, для создания библиотек. В зависимости от приложения разработчики могут выбирать статические или динамические библиотеки, которые являются очень полезными и практичными инструментами для создания программ.