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



«Я выбираю ленивого человека для тяжелой работы. Потому что ленивый человек найдет простой способ сделать это ». -Билл Гейтс

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

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

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

Как создать динамическую библиотеку (Linux)

Чтобы создать динамическую библиотеку в Linux, просто введите следующую команду: gcc *.c -c -fPIC и нажмите return. По сути, эта команда создает один объектный файл .o для каждого исходного файла .c. Флаг -fPIC гарантирует, что код не зависит от позиции. Это означает, что не имеет значения, где компьютер загружает код в память. Некоторым операционным системам и процессорам необходимо создавать библиотеки из позиционно-независимого кода, чтобы они могли решить во время выполнения, куда они хотят загрузить его в память. Параметры -c просто гарантируют, что каждый .o файл еще не связан.

Затем введите следующую команду: gcc *.o -shared -o liball.so (замените желаемое имя библиотеки на all) и нажмите return. Подстановочный знак * указывает компилятору скомпилировать все файлы .o в динамическую библиотеку, которая указана флагом -shared. Соглашение об именах для динамических библиотек таково, что каждое имя разделяемой библиотеки должно начинаться с lib и заканчиваться на .so. В остальном дайте волю своему воображению при выборе имен для ваших динамических библиотек.

Наконец, нам нужно экспортировать путь к библиотекам, чтобы программы знали, где их искать, выполнив следующую команду: export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH

Использование динамических библиотек (Linux)

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

gcc -L test_code.c -lholberton -o test_code

В приведенной выше команде стоит отметить, что ваш исходный код, test_code.c в данном случае, должен быть указан перед флагом -l. Выражение -l в сочетании с holberton указывает компилятору искать динамическую библиотеку с именем libholberton.so, а флаг -L указывает компилятору искать файл библиотеки в текущем каталоге. Вот почему важно использовать стандартный формат именования, который я описал ранее. Например, если test_code.c был следующим:

#include "holberton.h"
int main(void)
{
      _puts("Hello World!");
      return (0);
}

При вводе и выполнении gcc -L test_code.c -lholberton -o test_code будет создан исполняемый файл с именем test_code. Для этого компилятор просматривает библиотеку, указанную с помощью флага -l для кода объекта функции _puts. Выполнение test_code так: ./test_code даст нам следующий результат: Hello World!. Теперь, когда вы знаете, как создавать и использовать динамические библиотеки, отправляйтесь покорять мир!