1.软件准备
- qt-opensource-windows-x86-mingw482-4.8.7.exe Qt4的最后一个版本,bug应该是最少的,其他版本也类似。官方下载链接(329M)
- mysql-5.5.37-win32.msi MySql数据库,安装时注意选择全部安装。百度网盘下载(33M)
2.安装MySql
安装完成后,D盘根目录新建一个MySql文件夹,把D:\Program Files (x86)\MySQL\MySQL Server 5.5目录下的include和lib文件夹拷贝到C:\MySql。此处为了避免MySQL安装路径有空格,导致后续编译MySQL驱动报错,qmake mysql.pro报错但有些情况下没有影响
3.编译Qt的MySql驱动
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("192.168.2.128");
db.setPort(3306);
db.setDatabaseName("sdjk");
db.setUserName("root");
db.setPassword("");
bool ok = db.open();
if (ok)
{
qDebug() << QString("数据库打开成功");
}
else
{
qDebug() << "数据库打开失败:" << db.lastError();
}
上面这段代码就是打开数据库的代码了,不出什么以外的话应该有下面这个错误:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC
数据库打开失败: QSqlError(-1, "Driver not loaded", "Driver not loaded")
就是说没有MySql驱动,只有sqlite、odbc3、obdc驱动。
下面开始编译驱动:
- 打开D:\Qt\4.8.7\src\plugins\sqldrivers\mysql里面的mysql.pro
- pro文件里添加两行,就是包含前面Sql数据库的头文件和库,(不知道问什么第二行那样写不行,认不到)
INCLUDEPATH += "C:/MySql/include" #LIBS += "C:/MySql/lib/libmysql.lib" LIBS += -LC:/MySql/lib \ -lmysql
编译,
-
qmake mysql.pro
-
make release 与make debug
-
debug和release版本都编译一下,编译好后把debug下的libqsqlmysqld4.a、qsqlmysqld4.dll和release下的libqsqlmysql4.a、qsqlmysql4.dll拷贝到D:\Qt\4.8.7\plugins\sqldrivers
- 把C:\MySql\lib下的libmysql.dll拷贝到D:\Qt\4.8.7\bin下,发布程序的时候也要这个动态库。
错误2
D:\Qt\4.8.7\src\plugins\sqldrivers\mysql/../../../sql/drivers/mysql/qsql_mysql.cpp:1438: undefined reference to `mysql_free_result@4'
debug/qsql_mysql.o: In function `ZN12QMYSQLDriver16beginTransactionEv':
D:\Qt\4.8.7\src\plugins\sqldrivers\mysql/../../../sql/drivers/mysql/qsql_mysql.cpp:1456: undefined reference to `mysql_query@8'
debug/qsql_mysql.o: In function `ZN12QMYSQLDriver17commitTransactionEv':
D:\Qt\4.8.7\src\plugins\sqldrivers\mysql/../../../sql/drivers/mysql/qsql_mysql.cpp:1473: undefined reference to `mysql_query@8'
debug/qsql_mysql.o: In function `ZN12QMYSQLDriver19rollbackTransactionEv':
D:\Qt\4.8.7\src\plugins\sqldrivers\mysql/../../../sql/drivers/mysql/qsql_mysql.cpp:1490: undefined reference to `mysql_query@8'
debug/qsql_mysql.o: In function `ZNK12QMYSQLDriver11formatValueERK9QSqlFieldb':
D:\Qt\4.8.7\src\plugins\sqldrivers\mysql/../../../sql/drivers/mysql/qsql_mysql.cpp:1516: undefined reference to `mysql_real_escape_string@16'
collect2.exe: error: ld returned 1 exit status
Makefile.Debug:77: recipe for target 'debug\qsqlmysqld4.dll' failed
mingw32-make[1]: *** [debug\qsqlmysqld4.dll] Error 1
mingw32-make[1]: Leaving directory 'D:/Qt/4.8.7/src/plugins/sqldrivers/mysql'
Makefile:34: recipe for target 'debug' failed
mingw32-make: *** [debug] Error 2
此种情况,mysql64位系统,而QT为32位,位数不兼容,我重新卸载64位mysql,安装32位mysql成功解决。