Qt5.1.1 编译 MySql5.6.17驱动程序的过程和注意事项

44 篇文章 4 订阅
做一个小软件需要用到Qt和Mysql,然而Qt的官方发布版本是没有带Mysql驱动的,需要我们自己来编译Qt的Mysql驱动程序。
按照网上的参考步骤,走了各种弯路,解决了各种千奇百怪的问题,终于将Qt的Mysql驱动程序编译出来了,现将这个过程中步骤和一些注意事项总结如下:
(说实话,编译好Qt的Mysql驱动程序后突然好想念java,因为java不会整得这么复杂,java不会出现如此多的神奇BUG)

步骤:
Qt版本  Qt5.1.1
MySQL版本  MySQL5.6.17 (第一次编译时,使用的MySQL5.5.20,驱动倒是有了,但是Qt加载这个驱动一直失败,将数据库换成MySQL5.6.17后,问题被解决)

1.在D盘新建一个文件夹mysql_temp,然后将mysql安装目录下的include和lib文件夹拷贝到mysql_temp中(安装Mysql时选择的“Custom”,网上说选择typical会造成文件缺失,我没试过。)


2.下载Qt5.1.1的源码包,解压后将qtbase文件夹拷贝到qt的安装目录,我的Qt安装在D:/Qt/Qt5.1.1下的,所以我这儿是将qtbase文件夹拷贝到D:/Qt/Qt5.1.1下。(注:D:/Qt/Qt5.1.1目录下有
Licenses、Tools、5.1.1、vcredist等文件夹和README.txt、components.xml、MaintenanceTool.exe等文件,不同的版本可能有所不同)


3.由于vc的静态库格式为*.lib, mingw的动态库格式为*.a,内部格式也有所不同,还需要下载一个动态库格式转换工具,网址为: http://www.qtcn.org/download/mingw-utils-0.3.tar.gz,解压后把里

边bin目录里的remip.exe拷到mingw的bin目录里就可以使用了
   在cmd或qt自带mingw命令行工具中切盘到D:/mysql_temp/lib中使用下面两行命令,将vc的*.lib变为*.a
  (1)reimp -d libmysql.lib (生成libmysql.def文件)
  (2)dlltool -k -d libmysql.def -l libmysql.a (生成libmysql.a文件)


4.进入D:/Qt/Qt5.1.1/qtbase/src/plugins/sqldrivers/mysql目录后,在mysql.pro文件中增加如下:
   INCLUDEPATH += D:/mysql_temp/include
   LIBS += D:/mysql_temp/lib/opt/libmysql.a        (网上有写libmysql.lib的,想想都觉得不对,我写的libmysql.a反正编译过程没出现问题)
   QT += sql
  然后进行编译,编译步骤如下:
  (1)qmake -o Makefile mysql.pro
  (2)mingw32-make
  编译大约持续半分钟,编译结束后到D:\Qt\Qt5.1.1\qtbase\plugins\sqldrivers下可以找到编译得到的如下四个文件:
  libqsqlmysql.a
  libqsqlmysqld.a
  qsqlmysql.dll
  qsqlmysqld.dll
然后将这四个文件拷贝到D:/Qt/Qt5.1.1/5.1.1/mingw48_32/plugins/sqldrivers目录下

5.编写测试程序
#include <QtCore/QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlDatabase>
#include <QStringList>
#include <QDebug>
#include <QMessageBox>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "Available drivers:";
    QStringList drivers = QSqlDatabase::drivers();
    foreach(QString driver, drivers)
    qDebug() << "\t" << driver;
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 使用mysql数据库驱动
    db.setHostName("localhost");
    db.setDatabaseName("water_station"); // 我们之前建立的数据库
    db.setUserName("root"); // 直接用 root 用户名
    db.setPassword("password"); // root 用户的密码
    qDebug() << "MYSQL driver valid?" << db.isValid();
    std::cout<<"======================="<<std::endl;
    bool ok = db.open(); // 尝试连接数据库
    if(ok){

        QSqlQuery query; // 新建一个查询的实例
        if(query.exec("select * from t_test")){ // 尝试列出 t_test 表的所有记录
            QString user_id, user_name, user_addr;
            while(query.next()){ // 定位结果到下一条记录
                user_id = query.value(0).toString();
                user_name = query.value(1).toByteArray();
                user_addr = query.value(2).toByteArray();
                QString result = user_id + " " + user_name +" "+ user_addr ;
                std::cout<<result.toLatin1().data()<<std::endl;
            }
        } else { // 如果查询失败,用下面的方法得到具体数据库返回的原因
            QMessageBox::about(NULL,"error","a error happened when query!");
        }
    }else{
        QMessageBox::about(NULL,"error","mysql open failed!");
    }

    return a.exec();
}



在工程的*.pro文件中加入
Qt += sql
然后就可以正常编译运行了
运行截图如下所示:



编译过程注意事项:
1.若按照上面的做法仍然无法访问mysql数据库可以将D:/mysql_temp/lib/下的libmysql.a、libmysql.dll 也放到D:\Qt\Qt5.1.1\qtbase\plugins\sqldrivers路径下
2.软件发布时不要忘了将这些依赖库拷贝到发布的文件夹下

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值