Динамические библиотеки в Qt. Заключение


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

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

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

  • расширения для самой библиотеки;
  • расширения для собственных приложений.

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

Для поддержки расширений собственных приложений Qt предоставляет класс QPluginLoader, который способен как загружать, так и выгружать расширения. Приложение, поддерживающее расширения, должно предоставлять хотя бы один интерфейс, посредством которого будет производиться связь с компонентой расширения. Созданный интерфейс должен быть зарегистрирован при помощи макроса Q_DECLARE_INTERFACE. В приложении с помощью метаданных можно провести тест посредством шаблонной функции приведения типа qobject_cast<T>, то есть проверить — реализует ли расширение нужный нам интерфейс.

Классы расширений должны наследоваться от интерфейсов, предоставляемых приложением, и реализовывать их. Поэтому при реализации расширения его необходимо унаследовать сразу от двух классов: QObject и класса интерфейса, предоставляемого приложением. В классе определения расширения для генерирования МОС-метаданных необходимо разместить макрос Q_INTERFACES.

Читать далее: Совместное использование Qt с платформозависимыми API