Введение

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

Статические библиотеки

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

В нашем основном файле мы вызвали функцию, известную как hello. эту функцию в другой библиотеке.

При компиляции сначала он преобразует мой код и библиотеку в двоичный код (объектный файл)

Затем, в процессе компоновки, он берет двоичный код кода функции приветствия и помещает его в исполняемый файл.

Итак, в исполняемом файле теперь есть мой код и исходный код библиотеки функций

Этот пример просто для простоты

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

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

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

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

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

Недостаток

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

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

Команды для создания статической библиотеки

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

  1. Скомпилируйте файлы исходного кода в объектные файлы:

2. Заархивируйте объектные файлы в статическую библиотеку:

  • ар: архив
  • r: если файл библиотеки существовал раньше, замените его.
  • c: если он не существует, просто создайте его
  • s: этот параметр указывает ar создать индекс (или таблицу символов) для библиотеки. Индекс

Эта команда генерирует статическую библиотеку libexample.a с помощью программы ar из объектных файлов file1.o, file2.o и file3.o. При использовании узкого формата архива игнорирование информационных сообщений и создание чего-либо задаются параметрами -rcs.

Динамические библиотеки:

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

Так и будет

Итак, здесь вы не включаете весь код в свой файл, вы должны включить указатель на адрес, где хранится код.

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

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

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

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

Недостатки

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

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

Убедитесь, что программа совместима с конкретной версией динамической библиотеки, которая использовалась при ее разработке. Проблемы совместимости могут возникнуть из-за изменений в интерфейсе или поведении библиотеки.

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

Команды для создания статической библиотеки

Компиляция файлов исходного кода в позиционно-независимые объектные файлы и связывание их с файлом общей библиотеки — это шаги, необходимые для создания динамической библиотеки (разделяемой библиотеки). Обычные команды, необходимые для создания динамической библиотеки, перечислены ниже:

  1. Скомпилируйте файлы исходного кода в позиционно-независимые объектные файлы:

  • Создание разделяемых библиотек требует создания независимого от позиции кода, который параметр -fPIC побуждает компилятор предоставлять.
  • FPIC: параметр «Позиционно-независимый код» (fPIC) используется во время компиляции кода для создания позиционно-независимых объектных файлов.
  • Позиционно-независимый код подходит для использования в совместно используемых библиотеках (динамических библиотеках), поскольку его можно загружать и запускать в любом месте памяти. Каждая программа или библиотека должна иметь возможность доступа к своему собственному коду и данным, не мешая работе каких-либо других программ или библиотек, когда многие из них загружаются в память одновременно.
  • Компилятор гарантирует, что созданный объектный файл может быть загружен в любое место памяти без проблем, создавая позиционно-независимый код. В результате конфликты памяти между отдельными экземплярами общей библиотеки избегаются, поскольку каждый процесс, который ее использует, может загрузить библиотеку в отдельную позицию в памяти.

2. Свяжите позиционно-независимые объектные файлы с динамической библиотекой:

  • Эта команда создает libexample разделяемой библиотеки с помощью компоновщика gcc. Следовательно, из независимых от позиции объектных файлов файл1.о, файл2.о и файл3.о. В соответствии с опцией -shared в результате должна получиться разделяемая библиотека.
  • После выполнения этих команд у вас будет файл динамической библиотеки (libexample.so), который зависящие от него программы могут загружать и компоновать во время выполнения.