Qt - Сборка драйвера PSQL

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество
Перейти к навигации Перейти к поиску

Для работы Qt с СУБД PostgreSQL, кроме драйвера ODBC можно (а в некоторых случаях необходимо) использовать драйвер QPSQL. Но в виде скомпилированной библиотеки изначально его нет, потому сначала его необходимо собрать из исходников.

В статье пойдёт речь о сборке драйвера QPSQL в среде ОС MS Windows.

Все пути к файлам и каталогам, приведённые в статье, скорее всего будут отличаться от ваших, будьте внимательны.

Требования

  • ОС:
    • Microsoft Windows 7 Professional x32;
    • Microsoft Windows 7 Professional x64;
    • Microsoft Windows XP Home x32;
  • Qt 4.8.1 (установленный с исходниками (QtSouces));
  • PostgreSQL 8.4.12-1 x32.

Однако, это не означает, что на других версиях ОС и ПО ничего не получится. Здесь приведены лишь проверенные.

В системную переменную PATH должны быть добавлены следующие пути:

  • D:\Programs\Qt\Desktop\Qt\4.8.1\mingw\bin;
  • D:\Programs\Qt\mingw\bin;
  • D:\Programs\PostgreSQL\bin;
  • D:\Programs\PostgreSQL\include;
  • D:\Programs\PostgreSQL\lib.

После этого можно (и желательно) перезагрузить компьютер.

Пути до файлов библиотек и утилит Qt, в общем-то, не обязательны, но всё же не повредит добавить их в PATH.

Сборка

На самом деле, всё очень просто. Исходники драйвера QPSQL лежат в каталоге QtSources, достаточно лишь открыть его проектный файл в QtCreator и выполнить сборку.

Однако, это звучит слишком просто, чтобы быть правдой. И в самом деле - есть ряд некоторых нюансов.

Идём в D:\Programs\Qt\QtSources\4.8.1\src\plugins\sqldrivers\psql\.

Там лежит файл проекта psql.pro, открываем его в QtCreator. Он выцепит вместе с собой все остальные необходимые проекты. Нам надо изменить проект D:\Programs\Qt\QtSources\4.8.1\src\sql\drivers\psql\qsql_psql.pri (только не на диске его искать и открывать в блокноте, а именно тут, в проекте - в дереве файлов проекта развернуть ветку psql и редактировать файл проекта), комментируем в нём следующие строки:

HEADERS += $$PWD/qsql_psql.h
SOURCES += $$PWD/qsql_psql.cpp

unix|win32-g++* {
    LIBS *= $$QT_LFLAGS_PSQL
#    !contains(LIBS, .*pq.*):LIBS += -lpq
#    QMAKE_CXXFLAGS *= $$QT_CFLAGS_PSQL
#} else {
    !contains(LIBS, .*pq.*):LIBS += -llibpq -lws2_32 -ladvapi32
}

Теперь дописываем следующее в файл проекта psql.pro:

INCLUDEPATH += \
    "d:/Programs/PostgreSQL/include/"

LIBS += -L"d:/Programs/PostgreSQL/bin" -llibpq

Если INCLUDEPATH не сработает, и он потребует заголовочные файлы, то найдите их по именам в каталоге D:\Programs\PostgreSQL\include\ и скопируйте в каталог с проектом D:\Programs\Qt\QtSources\4.8.1\src\plugins\sqldrivers\psql\.

То же касается и библиотеки. Если не подхватит, то идём в D:\Programs\PostgreSQL\lib\ и копируем оттуда libpq.dll в D:\Programs\Qt\QtSources\4.8.1\src\plugins\sqldrivers\psql\.

Теперь можно выполнить сборку. Кстати, выполните обе сборки: и debug, и release.

Получившиеся qsqlpsqld4.dll и qsqlpsql4.dll поместите в D:\Programs\Qt\Desktop\Qt\4.8.1\mingw\plugins\sqldrivers\.

Теперь не забудьте вернуть назад все изменения в файлах psql.pro и qsql_psql.pri.

Проверка

Создаём проект для проверки - GUI-приложение, например. Кнопка и текстовое поле. По нажатию на кнопку в поле будут выводиться имена всех имеющихся драйверов и осуществляться попытка добавить базу данных с драйвером QPSQL.

В файле проекта дописать:

QT += sql

В исходниках формы на обработчик кнопки:

void MainWindow::on_pushButton_clicked()
{
    // вывод списка строк - имён драйверов
    QStringList list = QSqlDatabase::drivers();
    for(int x = 0; x < list.length(); x++)
        ui->log->append(list.at(x));

    // попытка создания подключения к БД посредством драйвера QPSQL
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    ui->log->append(tr("---<br><b>QPSQL-driver is ")
                    +(db.isValid()
                      ? tr("<font color=green>OK</font></b>")
                        : tr("<font color=red>NOT</font></b>")));
}

Скриншот приложения:

Загрузить исходники проверочного проекта можно здесь.

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