Разница между статической библиотекой и динамической библиотекой

Почему мы используем библиотеки?

Функции – это блоки кода, которые можно повторно использовать в программе. Их использование экономит время, избавляя от необходимости многократно переписывать код. Библиотеки, как и функции, также экономят время, поскольку позволяют повторно использовать функции в нескольких программах.

Преимущества и недостатки статических и динамических библиотек

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

Недостатком использования статической библиотеки является то, что ее код заблокирован в конечном исполняемом файле и не может быть изменен без повторной компиляции. Напротив, динамическая библиотека может быть изменена без необходимости повторной компиляции.

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

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

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

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

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

Создание динамической библиотеки

  1. gcc *.c -c -fPIC
    Исходные файлы .c необходимо подготовить для использования в динамической библиотеке. Поскольку несколько программ могут использовать один экземпляр динамической библиотеки, библиотека не может хранить данные по фиксированным адресам. Это связано с тем, что расположение библиотеки в памяти зависит от программы. Это делается с помощью флага компилятора -fPIC. Поскольку нам нужно применить этот шаг после того, как процесс компиляции сгенерировал объектный код, компилятор должен остановиться и вернуть один объектный файл (.o) для каждого исходного файла. Это делается с помощью флага -c.
  2. gcc *0 -shared -o liball.so
    Теперь объектные файлы готовы для компиляции в динамическую библиотеку. Это делается путем компиляции всех файлов .o с использованием флага -shared. Позднее при компиляции программных файлов компилятор идентифицирует библиотеку, ища файлы, начинающиеся с «lib» и заканчивающиеся расширением библиотеки (.so для динамических, .a для статических). Поэтому важно назвать библиотеку соответствующим образом.
  3. export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH
    Поскольку программа должна знать, где искать файлы библиотеки, мы должны добавить это местоположение в переменную окружения LD_LIBRARY_PATH.

Создание статической библиотеки

Создать статическую библиотеку намного проще. Сначала создайте объектные файлы так же, как в шаге 1 выше. Затем заархивируйте библиотеку, используя «ar rcs liball.a *.0».

Ваша программа должна включать прототип для каждой из функций, существующих в вашей библиотеке. Если вы используете заголовочный файл для этих прототипов, обязательно включите имя этого файла в другие ваши файлы, используя #include «‹header file›»

Компиляция программы
gcc -L. -lall -o my_program main.c

При компиляции программных файлов мы должны указать компилятору использовать библиотечные файлы и указать, где их найти. «-l» говорит, что мы хотим включить файлы библиотеки. И all говорит искать библиотеку liball.so. Важно оставить «lib» и «.so» вне флага, потому что компилятор уже идентифицирует библиотечные файлы таким образом. «-L.» сообщает компилятору, что он может найти файл библиотеки в текущем каталоге.