Использование динамических библиотек в Qt


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


LIBS += -lmy_dyn_lib
INCLUDEPATH += ../../my_dyn_lib/include

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

{рисунок}


#include <QtGui>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QLabel       lbl("this is the example text");
    QLibrary     lib("dynlib");

    typedef QString (*Fct) (const QString&);
    Fct fct = (Fct)(lib.resolve("oddUpper"));
    if (fct) {
        lbl.setText(fct(lbl.text()));
    }
    lbl.show();

    return app.exec();
}

Создается виджет надписи lbl, которому присваивается текст в конструкторе. Чтобы использовать динамическую библиотеку в программе, нужно создать объект класса QLibrary и передать в его конструктор имя файла динамической библиотеки, но заметьте — только имя, без расширения. Это связано с тем, что на разных платформах динамические библиотеки имеют различные расширения. В ОС Windows наша библиотека будет иметь расширение dll, в UNIX — so, а на MacOS X — dylib. Передавая только имя, мы возлагаем на Qt всю ответственность на подстановку нужного расширения.

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

Читать далее: Использование расширений (plug-ins) в Qt