Russian Qt Forum

Qt => Базы данных => Тема начата: Godfather от Июль 12, 2007, 18:43



Название: QT4 + MySQL
Отправлено: Godfather от Июль 12, 2007, 18:43
Всем привет!
Скажите плизз, что я делаю не так :?:

имеется Qt 4.3.0 commerical, MySQL 5.1, Visual Studio 2005 SP1
дистрибутив пропатчил, для VS проинсталлировал хотфикс

сначала запустил:
configure -qt-sql-mysql -plugin-sql-mysql -debug-and-release -platform win32-msvc2005 -static (и ещё много чего -no-)

компилирую дрова и плагины:

C:\Qt\4.3.0\src\sql\>nmake
всё хорошо
C:\Qt\4.3.0\bin\QtSql4.dll

C:\Qt\4.3.0\plugins\sqldrivers\>nmake
всё хорошо
в C:\Qt\4.3.0\plugins\sqldrivers\qsqlmysql4.dll , qsqlmysql4.lib

пробую:
Код:
QSqlDatabase dbCon = QSqlDatabase::addDatabase("QMYSQL");
dbCon.setHostName("localhost");
dbCon.setPort(3306);
dbCon.setUserName("root");
dbCon.setPassword("myroot");
if(!dbCon.open())
{
QString lastError = dbCon.lastError().text(); // не удалось открыть соединение
return false;
}
ошибка: Driver not loaded Driver not loaded

пробую добавить
Код:
#include <QtPlugin>
Q_IMPORT_PLUGIN(QSQLMYSQL)
ошибка:
Цитировать
Error   1   error LNK2019: unresolved external symbol "class QObject * __cdecl qt_plugin_instance_QSQLMYSQL(void)" (?qt_plugin_instance_QSQLMYSQL@@YAPAVQObject@@XZ) referenced in function "public: __thiscall StaticQSQLMYSQLPluginInstance::StaticQSQLMYSQLPluginInstance(void)" (??0StaticQSQLMYSQLPluginInstance@@QAE@XZ)   DA_MySQL.obj
что делать  :?:  :!:  :?:
умоляю помогите!


Название: Re: QT4 + MySQL
Отправлено: pastor от Июль 12, 2007, 18:46
Цитировать
ошибка: Driver not loaded Driver not loaded


Этот вопрос на форуме подмимался тысячи раз. Юзаем поиск


Название: QT4 + MySQL
Отправлено: Hellraiser от Июль 12, 2007, 19:11
Статическая Qt не работает с плагинами. Пересобери с ключом -shared


Название: QT4 + MySQL
Отправлено: Godfather от Июль 12, 2007, 19:43
Hellraiser, спасибо!
это вероятно решит проблему плагина

а почему дрова не робят?(
или я не понимаю связи между ними


Название: QT4 + MySQL
Отправлено: Hellraiser от Июль 12, 2007, 20:27
Цитата: "Godfather"
а почему дрова не робят?(
или я не понимаю связи между ними

Плагин не грузится, соответственно, не грузится драйвер (Qt даже и не подозревает о наличии такого  :wink: ). Если уж так хочется собрать статическую Qt, то и все расширения (SQL, Imageformats и прочее) надо тоже собирать статически (ключи -qt-sql-mysql а не -plugin-sql-mysql)


Название: QT4 + MySQL
Отправлено: Racheengel от Июль 12, 2007, 22:22
Да, только придется пересобирать под каждую версию сервера SQL индивидуально.


Название: QT4 + MySQL
Отправлено: Godfather от Июль 12, 2007, 23:07
а где почитать про различия плагина и драйвера?
я нигде на тролтеке не нашел толкового описания
и вообще запутался, честно говоря

плагин - это динамически подгужаемый драйвер?
а сам по себе драйвер отдельно - статический?

-qt-sql-mysql -- это драйвер
-plugin-sql-mysql -- это плагин

я конфигурировал qt с обоими ключами одноврменно
ибо я нигде не видел упоминания, что параметр плагин надо собирать с -shared, а параметр для драйверов - со -static

эти 2 параметра вообще можно указывать одновременно?

мне вообще пофиг как на самом деле
главное - что бы работало
и на клиентской машине тоже


Название: QT4 + MySQL
Отправлено: pastor от Июль 13, 2007, 00:16
Цитата: "Godfather"
а где почитать про различия плагина и драйвера?
я нигде на тролтеке не нашел толкового описания
и вообще запутался, честно говоря


Цитировать

    -qt-sql-<driver>          Enable a SQL <driver> in the Qt Library.
    -plugin-sql-<driver>    Enable SQL <driver> as a plugin to be linked to at run  time.
                      Available values for <driver>:
                              mysql
                              psql
                              oci
                              odbc
                              tds
                              db2
                              sqlite
                              sqlite2
                              ibase


Помоему все понятно с приведенного описания


Название: QT4 + MySQL
Отправлено: Godfather от Июль 13, 2007, 11:07
т.е. драйвер встраивается в QtSql(d)4.dll
либо хранится в qsqlmysql.dll и подключается динамически?


Название: QT4 + MySQL
Отправлено: pastor от Июль 13, 2007, 11:34
Совершенно верно


Название: QT4 + MySQL
Отправлено: Godfather от Июль 13, 2007, 15:05
спасибо за разъяснение! буду дальше копать :)

добавлено спустя 1 час 4 минуты:

 подскажите, пожалуйста, как теперь подключаить плагин? скомпилился успешно
Код:
#include <QtPlugin> 
Q_IMPORT_PLUGIN(QSQLMYSQL)
выдает по прежнему
Цитировать
Error   1   error LNK2019: unresolved external symbol "class QObject * __cdecl qt_plugin_instance_QSQLMYSQL(void)" (?qt_plugin_instance_QSQLMYSQL@@YAPAVQObject@@XZ) referenced in function "public: __thiscall StaticQSQLMYSQLPluginInstance::StaticQSQLMYSQLPluginInstance(void)" (??0StaticQSQLMYSQLPluginInstance@@QAE@XZ)   DA_MySQL.obj


добавлено спустя 1 час 16 минут:

 а после сборки со статическими драйверами (с nmake) такие выдаются ошибки:
Цитировать
Error   1   error LNK2001: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A)   DA_MySQL.obj   
Error   2   error LNK2001: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A)   frmMain.obj   
Error   3   error LNK2019: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A) referenced in function __ehhandler$?createDaDbStruct@IDataAdapter@@QAE?AUDaDbStruct@@VQString@@PAV3@@Z   IDataAdapter.obj   
Error   4   error LNK2001: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A)   ResponseConstructor.obj   
Error   5   error LNK2001: unresolved external symbol "public: static char * QSqlDatabase::defaultConnection" (?defaultConnection@QSqlDatabase@@2PADA)   DA_MySQL.obj   
Error   6   error LNK2001: unresolved external symbol "private: static class QTextCodec * QString::codecForCStrings" (?codecForCStrings@QString@@0PAVQTextCodec@@A)   DA_MySQL.obj   
Error   7   error LNK2001: unresolved external symbol "public: static struct QVectorData QVectorData::shared_null" (?shared_null@QVectorData@@2U1@A)   DA_MySQL.obj   
Error   8   error LNK2019: unresolved external symbol "public: static struct QVectorData QVectorData::shared_null" (?shared_null@QVectorData@@2U1@A) referenced in function "public: __thiscall QString::QString(class QString const &)" (??0QString@@QAE@ABV0@@Z)   frmMain.obj   
Error   9   error LNK2001: unresolved external symbol "public: static struct QVectorData QVectorData::shared_null" (?shared_null@QVectorData@@2U1@A)   IDataAdapter.obj   
Error   10   error LNK2001: unresolved external symbol "public: static struct QMetaObject const QMainWindow::staticMetaObject" (?staticMetaObject@QMainWindow@@2UQMetaObject@@B)   moc_frmMain1.obj   
Error   11   error LNK2001: unresolved external symbol "public: static enum QSysInfo::WinVersion const QSysInfo::WindowsVersion" (?WindowsVersion@QSysInfo@@2W4WinVersion@1@B)   qtmaind.lib   
Error   12   error LNK2001: unresolved external symbol "private: static struct QByteArray::Data QByteArray::shared_null" (?shared_null@QByteArray@@0UData@1@A)   qtmaind.lib   
втф ?? :?:  :?:


Название: QT4 + MySQL
Отправлено: pastor от Июль 13, 2007, 15:23
Цитата: "Godfather"

 подскажите, пожалуйста, как теперь подключаить плагин? скомпилился успешно


Как ты собрал? Статически?


Название: QT4 + MySQL
Отправлено: Godfather от Июль 13, 2007, 15:31
как я понял плагины надо собирать shared
а дрова static
правильно?


Название: QT4 + MySQL
Отправлено: pastor от Июль 13, 2007, 15:45
Брррр

Есть два понятия plugin и in the Qt Library. Если первый вариант - то у тебя каждый драйвер к БД будет размещаться в отдельной библиотеке (DLL), если второй вариант - все драйвера БД встрояться в бибилотеку Qt. Драйвер - это прослойка, между Qt и библиотекой для БД. Короче коворя plugin и in the Qt Library это способы размещения драйвера к БД - external или internal соответсвенно. Ничего более.


Название: QT4 + MySQL
Отправлено: Hellraiser от Июль 13, 2007, 15:47
переконфигурируй QT
configure -shared -debug-and-release -rtti -stl -plugin-sql-mysql


Название: QT4 + MySQL
Отправлено: Godfather от Июль 13, 2007, 15:51
если конфигурировать -plugin-sql-<driver> то это external-размещение
если -qt-sql-<driver> - то internal

соответственно я называю это плагин и дарйвер

вот если настраивать как shared plugin, то ошибка одна
если как static driver, то сразу много

спасибо Hellraiser сейчас попробую
я настраивал так же только -no-rtti и -no-stl
не стоило так делать?


Название: QT4 + MySQL
Отправлено: pastor от Июль 13, 2007, 16:01
Цитата: "Godfather"

соответственно я называю это плагин и дарйвер


Блин, это совершенно разные вещи и ненадо их смещивать. Плугин это плугин. Драйвер это драйвер. Грудо говоря это просто вспособ хранения драйвера: внутри или вне библиотеки.

Цитата: "Godfather"

я настраивал так же только -no-rtti и -no-stl
не стоило так делать?


Этим ты отключаешь rtti и stl. rtti имхо нафиг не нужен. stl - как кому. У себя я не юзаю этот функционал


Название: QT4 + MySQL
Отправлено: Godfather от Июль 13, 2007, 16:53
я не знаю что такое rtti и stl
поэтому их использую, поэтому и отключил
вроде бы это на функционирование плагинов не должно влиять

вопрос остается открытым - как заставить работать плагин
прочитал что надо ещё #include <QSqlDriverPlugin>

сейчас докомпилю -static -qt-sql-mysql и если опять не заработает, то попробую -shared -plugin-sql-mysql и использованием дополнительного иклуда

а ешё я на qtcentre.org прочёл: "You need static plugins to make it work that way."
это как??
как я понял плагины надо конфигурировать как шейрд

добавлено спустя 46 минут:

 я буду плакать!! (((

драйвера сбилдились
плагины тоже

драйвер QSQLMYSQL виден в \demo\sqlbrowser\

приложения не компиляться, рагаютются на Unresolved externs
ыыыыыыы


Название: QT4 + MySQL
Отправлено: pastor от Июль 13, 2007, 17:19
Приведи код!


Название: QT4 + MySQL
Отправлено: Godfather от Июль 13, 2007, 17:45
ничего не понимаю (с) брать пилоты

Output:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC

при том что \demo\sqlbrowser\ видит драйвер QMYSQL и соединяется с базой!
что я делаю не так?

а код самый обычный, ничего выдающегося, из примеров практически


Название: QT4 + MySQL
Отправлено: -=s0L=- от Июль 13, 2007, 18:07
Цитата: "Godfather"
я не знаю что такое rtti и stl


ну чтож, похвально.. похвально..., у меня такое чувство, что ты еще не до конца оценил силу с++ :)


Название: QT4 + MySQL
Отправлено: pastor от Июль 13, 2007, 19:03
Цитата: "Godfather"

а код самый обычный, ничего выдающегося, из примеров практически


http://prog.org.ru/forum/topic_2141.html

ЗЫ: Поюзай поиск по форуму


Название: QT4 + MySQL
Отправлено: Godfather от Июль 13, 2007, 19:40
спасибо!

в той теме кстати интересная фраза:
"P.S. В Qt 4.1 плагины можно слинковать статически и проблема отпадает сама собой"


Название: QT4 + MySQL
Отправлено: Godfather от Июль 16, 2007, 13:30
заработало!
всем большое спасибо!!

вот моё решение:

%QTDIR%\> configure -shared -qt-sql-mysql -platform win32-msvc2005
%QTDIR%\src\sql> qmake -o Makefile sql.pro "INCLUDEPATH+=c:\mysql\include" "LIBS+=c:\mysql\lib\opt\libmysql.lib"
%QTDIR%\src\sql> nmake

и никаких дополнительных библиотек в корне приложения, итп


Название: QT4 + MySQL
Отправлено: crossly от Июль 16, 2007, 23:01
человек..... драйвер и плагин это разные вещи ...:)... во первых: при сборке qt будь уверен сто qt йе знает пути к либам и заголовкам.... если све гуд, то по пробуй удалить ветку реестра \HKLM\Software\Trolltech и где то там false :)


Название: QT4 + MySQL
Отправлено: Godfather от Июль 16, 2007, 23:17
конечно я знаю различия между драйвером как плагином и драйвером, встроенным в в общую библиотеку
ага и кэш плагинов я удалял

в моём случае вся тонкость в понимании разницы между shared и static преставлением
правда я ещё не понял в чём, в процессе понимания

а либы и заголовки тут не при чём
это очень простая ошибка
лечится либо configure -I "путь к заголовкам" -L "путь к либам"
(кстати в 4.3.0 -L глючит)
либо qmake "INCLUDEPATH+=путь к заголовкам" "LIBS+=путь к либам" в папке с драйвером/плагином


Название: QT4 + MySQL
Отправлено: Racheengel от Июль 17, 2007, 19:25
вообще RTTI - Run Time Type Info - лучше включить.
А так кто-нибуть его затребует, вот приложение и свалится...


Название: QT4 + MySQL
Отправлено: pastor от Июль 17, 2007, 19:51
имхо, про RTTI лучше помнить, но выключать ;) В большенстве случаеях он не нужен. У себя в проектах ниразу не юзал, ибо надобности в нём невижу. Функционала Qt, имхо пердостаточно.


Название: QT4 + MySQL
Отправлено: Racheengel от Июль 17, 2007, 20:33
Когда начинаешь юзать сторонние либы, приходится о нем вспоминать, когда приложение начнет валиться...


Название: QT4 + MySQL
Отправлено: crossly от Июль 18, 2007, 20:20
друг.... при сборке static lib... qt предупреждает что использовать плагины ты не сможешь...... растолкуй подробно что тебе нужно....


Название: QT4 + MySQL
Отправлено: pastor от Июль 18, 2007, 20:33
Цитата: "crossly"
друг.... при сборке static lib... qt предупреждает что использовать плагины ты не сможешь...... растолкуй подробно что тебе нужно....


А де такое написано? Не встречал.
Объясни зачем тогда нужен нам Q_IMPORT_PLUGIN?