Qt MySQL не может загрузить драйвер плагина (QLibrary, QPluginLoader успешно загружены, QSqlDatabase::drivers() возвращает пустое значение!)

Я успешно скомпилировал драйверы MySQL, но не могу заставить Qt загрузить их.

Что нужно сказать в начале Ив получил драйвера ODBC и SQLite с пакетом (после установки Qt) и они тоже не определяются.

В *C:\Qt\4.8.0\plugins\sqldrivers* Iv получил:

qsqlite4.dll

qsqlite4.lib

qsqlited4.dll

qsqlited4.lib

qsqlmysql4.dll

qsqlmysql4.lib

qsqlmysqld4.dll

qsqlmysqld4.lib

qsqlodbc4.dll

qsqlodbc4.lib

qsqlodbcd4.dll

qsqlodbcd4.lib

qsqlpsql4.dll

qsqlpsql4.lib

qsqlpsqld4.dll

qsqlpsqld4.lib

Файлы qsqlmysql*.*, которые я также добавил:

C:\Qt\4.8.0\бин

ПРИМЕНЕНИЕ\

ПРИЛОЖЕНИЕ\Отладка\

ПРИЛОЖЕНИЕ\Выпуск\

ПРИЛОЖЕНИЕ\sqldrivers\

Конечно, Ив также установил QtSql*.dll.

Iv правильно настроил .pro:

QT += основной графический интерфейс сети sql

И я запускаю этот код:

#include <QSqlRecord>
#include <QSqlError>

QLibrary mysqllib("qsqlmysqld4.dll");
mysqllib.load();
auto t1 = mysqllib.isLoaded();
qDebug()<<"my library loaded"<<mysqllib.isLoaded();

QPluginLoader plug("qsqlmysqld4.dll");
plug.load();
auto t2 = plug.isLoaded();
qDebug()<<"mysql plugin is loaded"<<plug.isLoaded();

ui->textEditContent->append( "--SQL DRIVERS SUPPORTED:--\n" );
FOREACH( auto driver, QSqlDatabase::drivers() )
    ui->textEditContent->append( "  " + driver + "\n" );

QLibrary и QPluginLoader возвращают true. И QSqlDatabase::drivers() пуст. Что я делаю неправильно? Ни один из драйверов в C:\Qt\4.8.0\plugins\sqldrivers не виден Qt. Iv скомпилировал драйверы Qt и SQL одним и тем же компилятором (MSVC2010) без ошибок. Я запускаю свой код в течение нескольких месяцев. Стояла задача добавить поддержку MySQL.


person killdaclick    schedule 16.01.2013    source источник


Ответы (2)


Проблема решена! Я изменил код, теперь он выглядит так:

#include <QSqlRecord>
#include <QSqlError>    

QStringList liblist;
liblist.push_back("c:/Qt/4.8.0/plugins/");
liblist.push_back("c:/Qt/4.8.0/bin/");
QCoreApplication::setLibraryPaths(liblist);

QLibrary mysqllib("qsqlmysqld4.dll");
mysqllib.load();
auto t1 = mysqllib.isLoaded();
qDebug()<<"my library loaded"<<mysqllib.isLoaded();

QPluginLoader plug("qsqlmysqld4.dll");
plug.load();
auto t2 = plug.isLoaded();
qDebug()<<"mysql plugin is loaded"<<plug.isLoaded();

ui->textEditContent->append( "--SQL DRIVERS SUPPORTED:--\n" );
FOREACH( auto driver, QSqlDatabase::drivers() )
    ui->textEditContent->append( "  " + driver + "\n" );

Кажется, что даже если у Qt есть пути к собственной папке, вам нужно указать их перед загрузкой драйверов. Вы можете сделать это, добавив эти строки:

QStringList liblist;
liblist.push_back("c:/Qt/4.8.0/plugins/");
liblist.push_back("c:/Qt/4.8.0/bin/");
QCoreApplication::setLibraryPaths(liblist);

Если вы хотите включить эти драйверы в папку вашего приложения, как это делаю я, вы создаете папку «sqldrivers» в корне вашего приложения и добавляете путь к этому корню. Итак, у нас есть libmysql.dll и qsqlmysql.dll в:

X:\ПРИЛОЖЕНИЕ\sqldrivers\

и код выглядит так:

QStringList liblist;
liblist.push_back(QDir::currentPath()); // Qt always looks for those drivers in <LIB_FOLDER_SPECIFIED>/sqldrivers/
//liblist.push_back("e:/Qt/4.8.0/bin/");
//liblist.push_back("e:/Qt/4.8.0/plugins/");
QCoreApplication::setLibraryPaths(liblist);
person killdaclick    schedule 17.01.2013
comment
+1: Спасибо за QCoreApplication::setLibraryPaths(liblist); Загрузка библиотек/плагинов не работала на моем ПК, но драйвер был доступен. Кажется, что пути установки было достаточно. - person Valentin Heinitz; 15.09.2013
comment
Спасибо за подсказку о подкаталоге sqldrivers. Я добавил этот подкаталог в выходной каталог EXE моего приложения и скопировал libmysql.dll и qsqmysql4.dll (варианты «d» для отладки), и он отлично работает! Мне даже не нужно было добавлять какой-либо код в приложение, чтобы загрузить их. - person BrandonLWhite; 30.12.2013

Также вам понадобится libmysql.dll в

C:\Qt\4.8.0\bin

APPLICATION\

APPLICATION\Debug\

APPLICATION\Release\
person Ruslan F.    schedule 16.01.2013
comment
libmysql.dll присутствует и загружен. Вывод из msvc: «ELF_2013-01-16.exe»: загружен «F:\SRC_ELF\ProjectStructure\src\app\Debug\qsqlmysqld4.dll», символы загружены. «ELF_2013-01-16.exe»: загружен «F:\SRC_ELF\ProjectStructure\src\app\Debug\libmysql.dll», символы загружены. 'ELF_2013-01-16.exe': загружено 'C:\Windows\SysWOW64\secur32.dll', не удается найти или открыть файл PDB, загруженный моей библиотекой true 'ELF_2013-01-16.exe': загружен 'F:\ SRC_ELF\ProjectStructure\src\app\qsqlmysqld4.dll', символы загружены. Плагин mysql загружен true QSqlDatabase: драйвер QMYSQL не загружен QSqlDatabase: доступные драйверы: - person killdaclick; 17.01.2013