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


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


TEMPLATE = lib
DESTDIR  = ..
QT       -= gui
SOURCES  = dynlib.cpp
HEADERS  = dynlib.h
TARGET   = dynlib

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

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


#include <QString>

extern "C" {
    QString oddUpper(const QString& str);
}

В динамическую библиотеку должны быть экспортированы прототипы функций для их дальнейшего использования. Эти функции необходимо заключить в спецификатор extern "C" {...}. В этом случае компилятор C++ не будет прикреплять информацию о типе к символьной сигнатуре функции. Без этого спецификатора компилятор может подставить вместо имени функции oddUpper() совсем другое имя, в котором будет закодирована дополнительная информация. Это нужно, если вы хотите, чтобы вашу динамическую библиотеку можно было загружать в процессе работы основной программы, например, при помощи класса QLibrary, о котором речь пойдет далее.


#include "dynlib.h"

QString oddUpper(const QString& str)
{ 
    QString strTemp;

    for (int i = 0; i < str.length(); ++i) {
        strTemp += (i % 2) ? str.at(i) : str.at(i).toUpper();
    }

    return strTemp;
}

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

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