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

  Юрий  | 

    | 

  Обновл. 11 Фев 2019  | 

 1663

 ǀ   4 

Библиотека – это «сборник» кода, который можно многократно использовать в самых разных программах. Как правило, библиотека в C++ состоит из двух частей:

   заголовочный файл, который объявляет функционал библиотеки;

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

Некоторые библиотеки могут быть разбиты на несколько файлов и/или иметь несколько заголовочных файлов.

Библиотеки предварительно компилируют по нескольким причинам. Во-первых, их код редко меняется. Было бы напрасной тратой времени повторно компилировать библиотеку каждый раз при её использовании в новой программе. Во-вторых, поскольку весь код предварительно скомпилирован в машинный язык, то это предотвращает получение доступа к исходному коду (и его изменение) сторонними лицами. Этот пунктик важен для предприятий/людей, которые не хотят, чтобы результат их труда (исходный код) был доступен всем (интеллектуальная собственность, все дела).

Есть два типа библиотек: статические и динамические.

Типы библиотек

Статическая библиотека (или ещё «архив») состоит из подпрограмм, которые непосредственно компилируются и линкуются с вашей программой. При компиляции программы, которая использует статическую библиотеку, весь функционал статической библиотеки (тот, что использует ваша программа) становится частью вашего исполняемого файла. В Windows статические библиотеки имеют расширение .lib (от «library»), тогда как в Linux статически библиотеки имеют расширение .a (от «archive»). Одним из преимуществ статических библиотек является то, что вам нужно распространять всего лишь 1 файл (исполняемый файл), дабы пользователи могли запустить и использовать вашу программу. Поскольку статические библиотеки становятся частью вашей программы, то вы можете использовать их подобно функционалу своей собственной программы. С другой стороны, поскольку копия библиотеки становится частью каждого вашего исполняемого файла, то это может привести к увеличению размера файла. Также, если вам нужно будет обновить статическую библиотеку, вам придётся перекомпилировать каждый исполняемый файл, который её использует.

Динамическая библиотека (или ещё «общая библиотека») состоит из подпрограмм, которые подгружаются в вашу программу во время её выполнения. При компиляции программы, которая использует динамическую библиотеку, эта библиотека не становится частью вашего исполняемого файла – она ​​так и остаётся отдельным модулем. В Windows динамические библиотеки имеют расширение .dll (от «dynamic link library» = «библиотека динамической компоновки»), тогда как в Linux динамические библиотеки имеют расширение .so (от «shared object» = «общий объект»). Одним из преимуществ динамических библиотек является то, что разные программы могут совместно использовать одну копию динамической библиотеки, что значительно экономит используемое пространство. Ещё одним преимуществом динамической библиотеки является то, что её можно обновлять ​​до более новой версии без перекомпиляции всех исполняемых файлов, которые её используют.

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

Библиотека импорта (import library) – это библиотека, которая автоматизирует процесс подключения и использования динамической библиотеки. В Windows это обычно делается через небольшую статическую библиотеку (.lib) с тем же именем, что и динамическая библиотека (.dll). Статическая библиотека линкуется с вашей программой во время компиляции, и тогда функционал динамической библиотеки может эффективно использоваться в вашей программе, как если бы это была обычная статическая библиотека. В Linux общий объектный файл (с расширением .so) дублируется сразу как динамическая библиотека и библиотека импорта. Большинство линкеров при создании динамической библиотеки автоматически создают к ней библиотеку импорта.

Установка библиотек


Теперь, когда мы уже разобрались с типами библиотек, давайте поговорим о том, как их использовать в наших программах. Установка библиотеки в C++ состоит из 4 последовательных шагов:

Шаг №1: Получите библиотеку. Наилучшим вариантом является найти уже предварительно скомпилированный код под вашу операционную систему (если он вообще существует), дабы вам не пришлось компилировать библиотеку самостоятельно. В Windows библиотеки обычно распространяются в виде архивов (файлов .zip). В Linux это пакеты кода (например, .RPM).

Шаг №2: Установите библиотеку. В Linux это делается путём вызова менеджера пакетов, а дальше он всё сделает сам. В Windows вам придётся разархивировать библиотеку самостоятельно в любую выбранную вами папку. Рекомендуется хранить все используемые библиотеки в одном месте для быстрого доступа к ним. Например, создайте папку Libs (C:\Libs) и выделяйте для каждой, используемой вами библиотеки, свою отдельную подпапку.

Шаг №3: Убедитесь, что компилятор знает, где искать заголовочные файлы библиотеки. В Windows это обычно подпапка include внутри основной папки библиотеки (например, если вы установили библиотеку в C:\Libs\SDL-1.2.11, то заголовочные файлы находятся в C:\Libs\SDL-1.2.11\include). В Linux библиотеки обычно устанавливаются в /usr/include. Однако, если файлы установлены в другом месте, вам нужно будет сообщить компилятору, где именно.

Шаг №4: Сообщите линкеру, где искать файлы с реализацией функционала библиотеки. Аналогично с предыдущим шагом, вам нужно указать линкеру место, где находятся файлы с реализацией библиотеки. В Windows это обычно подпапка /lib внутри основной папки библиотеки (C:\Libs\SDL-1.2.11\lib). В Linux это обычно /usr/lib.

Использование библиотек

Как только библиотека установлена ​​и ваша IDE знает, где искать её файлы, то для того, чтобы вы могли использовать эту библиотеку в ваших проектах – вам необходимо выполнить следующие 3 шага:

Шаг №5: Если вы используете статические библиотеки или библиотеки импорта, сообщите линкеру, какие файлы библиотеки нужно связать с вашей программой.

Шаг №6: #include заголовочные файлы библиотеки в вашей программе.

Шаг №7: Если вы используете динамические библиотеки, убедитесь, что исполняемые файлы будут иметь доступ к файлам библиотеки. Самый простой способ использовать .dll – это скопировать .dll в папку с исполняемым файлом. Поскольку .dll-ка обычно распространяется вместе с исполняемым файлом, то это не составит никаких трудностей.

Заключение


Шаги №3-5 включают настройку вашей IDE – к счастью, почти все IDE работают одинаково, когда дело доходит до выполнения подобных задач. В следующих уроках мы рассмотрим, как выполнить эти шаги в Visual Studio и в Code::Blocks. Ничего страшного, если вы используете другую IDE, принцип действий один и тот же + немножко гугления и вы справитесь.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (12 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 4

  1. Аватар Мalika:

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

    1. Юрий Юрий:

      Пожалуйста 🙂

  2. Аватар Евгений:

    Всё, конец?

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *