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

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

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

Зачем использовать библиотеки в C?

Основная причина использования библиотеки на C — это когда у вас есть фрагмент кода, который может быть полезен для многих других программ или файлов. Таким образом, вместо того, чтобы тратить время на написание кода и, возможно, на исправление некоторых ошибок (повторяя часть кода, который у вас уже есть), вы могли бы использовать библиотеки, чтобы сделать свою жизнь счастливее. В двух словах, если вы хотите быть более эффективным при кодировании, используйте библиотеки, это вам очень поможет.

После того, как мы ответим на вопросы о библиотеках и почему, мы начнем путешествие, и наша первая остановка будет посвящена понятиям статических и динамических библиотек в C.

Что такое статическая библиотека?

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

Преимущества

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

Недостатки

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

Что такое динамическая библиотека?

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

Преимущества

  • Одна копия библиотеки загружается в память, когда запущена программа, которая ее использует, и когда несколько запущенных программ используют эту библиотеку, мы можем сэкономить много памяти.
  • Если какие-либо изменения были сделаны внутри библиотеки, нам не нужно перекомпилировать нашу программу.
  • Вышеупомянутое преимущество также упрощает обслуживание библиотеки.

Недостатки

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

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

Как работают статические библиотеки и как их создавать

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

Для создания статических библиотек мы используем программу под названием ar (аббревиатура от «архиватор»). Эта программа позволяет нам создавать статические библиотеки, изменять и извлекать объектные файлы из библиотеки. Для создания статической библиотеки мы используем следующую команду:

Флаг r указывает программе заменить старые объектные файлы в библиотеке новыми объектными файлами. С другой стороны, флаг c указывает программе создать библиотеку, если она еще не существует.

Следует отметить, что после создания или изменения файла (объектного файла) необходимо его проиндексировать, чтобы компилятор мог ускорить поиск символов внутри библиотеки. По этой причине мы используем команду:

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

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

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

Когда программа выполняется, системный динамический загрузчик ищет некоторые библиотеки в определенных каталогах. Если библиотеки нет, значит, это библиотека, которую мы создаем. Таким образом, в этом случае мы можем указать динамическому загрузчику искать в других каталогах, используя переменную окружения LD_LIBRARY_PATH следующим образом (в данном случае мы работаем в sh):

Если LD_LIBRARY_PATH не определен:

LD_LIBRARY_PATH=/полный/путь/к/библиотеке/каталогу
экспортировать LD_LIBRARY_PATH

Если LD_LIBRARY_PATH уже определен:

LD_LIBRARY_PATH=/полный/путь/к/библиотеке/каталогу:${LD_LIBRARY_PATH}
экспортировать LD_LIBRARY_PATH

И, наконец, чтобы убедиться, что ваша библиотека находится в вашей системе, вы используете следующую команду:

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

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

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

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

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

Основные различия между статическими и динамическими библиотеками:

  • Статические прикрепляются к исполняемому файлу во время компиляции.
  • Динамические — это файлы вне исполняемого файла (во время компиляции исполняемый файл получает ссылку, указывающую на библиотеку, но объектные файлы не загружаются внутрь исполняемого файла).
  • Код, связанный с исполняемым файлом из Static, нельзя изменить без перекомпиляции.
  • Динамическая библиотека может быть изменена без перекомпиляции.
  • Статическая библиотека копируется в код каждой исполняемой программы во время компиляции.
  • Динамическая копия создается только один раз.
  • Программа более уязвима с Dynamic, потому что, если библиотека повреждена, исполняемый файл не будет работать.
  • Статическая библиотека дает исполняемому файлу больше автономии, потому что код внутри него.

«После того как вы отправились в путешествие, путешествие никогда не заканчивается, а разыгрывается снова и снова в самых тихих покоях. Ум никогда не может оторваться от путешествия». ~ Пэт Конрой