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

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

Статический и динамический:

  • Скорость: для запуска программы, использующей динамическую библиотеку, требуется немного больше времени, потому что компьютер должен искать библиотеку. В статической библиотеке копия библиотеки находится внутри исполняемого файла, поэтому компьютеру не нужно ее искать.
  • Хранилище файла/размер исполняемого файла: динамические библиотеки занимают меньше места, поскольку в файловой системе есть только одна копия.
  • Простые изменения: изменять программы с помощью динамической библиотеки легко, потому что все программы, зависящие от библиотеки, автоматически отразят это изменение. В статической библиотеке все файлы должны быть перекомпилированы. У этого есть возможный недостаток, заключающийся в том, что можно легко сломать всю программу, внедрив в библиотеку ошибочный код.
  • Сложности: использование динамических библиотек может усложниться. См. Ад DLL.

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

Сначала соберите .c файлы, которые вы хотите в библиотеке, в папку. Включение заголовочного файла с прототипами функций полезно.

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

Далее введите команду gcc -shared -Wl,-soname,[library name] -o [library name] *.o . gcc компилируется, конечно. -shared создает общий объект, который затем может быть связан с другими объектами для формирования исполняемого файла. -Wl передает параметр компоновщику, в данном случае желаемое имя библиотеки. Имена библиотек обычно начинаются с lib, а динамические библиотеки заканчиваются на .so. -o указывает, что библиотека будет иметь следующее имя, [library name]. Как и *.c в последней команде, *.o указывает на все файлы в текущем каталоге с расширением .o.

Теперь у вас есть библиотека! Для проверки содержимого динамической библиотеки можно использовать те же команды, что и для статической библиотеки.

Один из способов позволить вашему компьютеру легко найти библиотеку — изменить переменную окружения LD_LIBRARY_PATH, включив в нее текущий каталог. В противном случае программа, использующая библиотеку, не сможет выполниться, поскольку не знает, где находится библиотека. .:[VARIABLE] — это сокращение для добавления текущего каталога к пути. Для получения дополнительной информации см. этот пост.

Наконец, мы можем проверить, что библиотека работает, написав пример программы и скомпилировав ее с помощью команды gcc -Wall -pedantic -Werror -Wextra -L. [filename] -l[library name] -o [executable name]. -Wall -pedantic -Werror -Wextra добавлять предупреждения, помогающие обнаруживать ошибки, но не являющиеся строго необходимыми. -L добавляет каталог в список каталогов для поиска библиотеки (. указывает текущий каталог). [filename] — это .c пример программы, которую мы написали. Имя библиотеки без lib и .so следует после -l. Еще раз флаг -o указывает желаемое имя исполняемого файла.

Вот как создается динамическая библиотека. Удачного кодирования!

  • Все это специфично для Linux.
  • Описание опций gcc взято с справочной страницы gcc.