Windows下Qt的MySQL驱动编译方法及异常错误解决方案

2015-11-20

近期,在Windows下使用MinGW编译Qt的MySQL驱动的过程中,几经周折,才编译通过。编译过程中,遇到了诸多问题。为了避免后续的驱动编译不犯类似的错误,便于快速完成此驱动编译,现将编译方法进行整理。

此方法以本人自己编译的环境为案例进行说明。

一、   编译环境

操作系统:Win7 64位

MySQL服务版本:mysql-5.5.46-win32

Qt版本:4.8.6

编译环境:MinGW 64位

二、   编译步骤

(一)         生成libmysql.a文件

由于mingw编译器连接静态库需要使用”.a”后缀的静态库文件,但是按照MySQL数据库后,只有”.lib”格式的静态库,因此需要进行转换。转换时需要用到两个工具:reimp.exe和dlltool.exe,这两个工具的路径需要再PATH环境变量中配置。转换命令如下:

首先,打开cmd命令输入框,进入MySQL安装路径下的lib路径,例如我的路径为:” C:\Program Files(x86)\MySQL\MySQL Server 5.5\lib”。

其次,依次输入下述命令:

reimp -d libmysql.lib

dlltool -k -d libmysql.def -l libmysql.a

执行成功后,即可在此路径下查看到libmysql.a的库文件。

(二)         编辑mysql.pro工程文件

在Qt的安装路径下找到mysql.pro文件,我的pro文件的路径为:”C:\Qt\4.8.6\src\plugins\sqldrivers\mysql\”。

打开mysql.pro文件,在下方添加如下配置:

INCLUDEPATH+="C:/ProgramFiles(x86)/MySQL/MySQL Server 5.5/include/"

LIBS+= -L"C:/ProgramFiles(x86)/MySQL/MySQL Server 5.5/lib/" –llibmysql

第二行也可以写成如下方式:

LIBS+= "C:/ProgramFiles(x86)/MySQL/MySQL Server 5.5/lib/libmysql.a"

将生成Makefile、Makefile.Debug、Makefile.Release三个Makefile文件及其它文件。如下图所示:

(三)         编辑Makefile文件

以Debug版本为例说明。打开Makefile.Debug文件,找到LIBS=”XXXX”行,进行修改。因为生成的此项配置存在问题。

原始配置如下:

LIBS = -L"c:\Qt\4.8.6\lib"debug\qsqlmysqld_resource_res.o -llibmysql "-LC:/ProgramFiles(x86)/MySQL/MySQL Server 5.5/lib/" -llibmysql -lQtSqld4 -lQtCored4

根据我们的意图,按照Makefile的语法规则,可以明显发现问题所在,首先,”-L”必须放在配置库的路径的外部,其次,-llibmysql命令存在重复。

修改后如下:

LIBS = -L"c:\Qt\4.8.6\lib"debug\qsqlmysqld_resource_res.o -L "C:/Program Files(x86)/MySQL/MySQLServer 5.5/lib/" -llibmysql -lQtSqld4 -lQtCored4

或者修改成如下方式:

LIBS = -L"c:\Qt\4.8.6\lib"debug\qsqlmysqld_resource_res.o "C:/Program Files(x86)/MySQL/MySQL Server5.5/lib/libmysql.a" -lQtSqld4 -lQtCored4

Release版本的Makefile的修改方式与此相同。

(四)         执行make命令

使用mingw32-make命令执行makefile。若不加参数,则默认执行Makefile.Debug。可以在mingw32-make 命令后写上debug或release 或者两者都写上,即可执行对应版本的Makefile。

例如同时执行debug和release版本的Makefile文件,命令如下:

mingw32-make debug release

执行成功后,即可在debug文件夹下看到qsqlmysqld.a、qsqlmysqld.dll两个库文件,在release文件夹下看到qsqlmysql.a、qsqlmysql.dll两个库文件。

这四个库文件,即是编译成功的debug和release版本的mysql驱动静态库和动态库。

(五)         拷贝驱动文件到指定目录

将上一步生成的四个驱动文件,拷贝到Qt的数据库驱动目录下,即” C:\Qt\4.8.6\plugins\sqldrivers\”路径下。

(六)         拷贝libmysql.dll文件到指定目录

将MySQL安装路径下的libmysql.dll动态库文件,拷贝到Qt的bin目录下,即” C:\Qt\4.8.6\plugins\sqldrivers\”。此时,使用Qt编写程序连接MySQL数据库即可连接成功。

三、   测试驱动是否可用

编写测试Qt驱动的demo程序。主要代码如下:

#include <QtCore/QCoreApplication>  

#include <QDebug>  

#include <QStringList>  

#include <QString>  

#include <QSqlDatabase>  

int main(int argc, char *argv[])  

{  

    QCoreApplication a(argc, argv);  

    qDebug()<<"Available drivers:";  

    QStringList drivers = QSqlDatabase::drivers();  

    foreach(QString driver,drivers)  

    qDebug()<<"\t"<<driver;  

    return a.exec();  

}  

在工程文件中添加

QT       +=sql

运行此demo程序,即可在可用驱动列表中,看到”QMYSQL3”、” QMYSQL”两个驱动项目。如下图所示:


四、   常见问题及解决方案

(一)         Cannot find –llibmysql

找不到“-llibmysql”,原因是Makefile里面的配置不正确。修改Makefile后,再次编译,编译通过。

此问题的解决方案是:请检查Makefile中的配置,修改使其符合Makefile语法规则后再次尝试。

(二)         Undefined reference to ‘mysql_character_set_name@4’

出现这种情况,及一系列与mysql相关的未定义的引用时,原因是加载mysql的库时出现问题。经过网上查询相关资料,得知是MySQL数据库的版本问题,使用64位的MySQL数据库中的链接库时,就会报此错误。

解决方案是,安装32位的MySQL数据库,配置mysql.pro文件中相关的路径,再次编译此驱动,此错误就不再出现。

(三)         unrecognized command line option\"-fno-keep-inline-dllexport\"

查询网上相关资料,出现此错误的原因是因为编译器的版本较低,查询当前使用的gcc编译器的版本,是GCC -4.4.0。网上资料的解释如下:

this is because\"-fno-keep-inline-dllexport\" is the option of mingw 4.6.1, but i'musing 4.5. So I change it by installingcodelite-3.5.5377-mingw4.6.1-wx2.9.2.exe

翻译如下:

这是因为\"-fno-keep-inline-dllexport\"这个选项是mingw4.6.1才具备的功能,当前使用版本太低,因此需要使用4.6.1以上版本的gcc编译器。

后来安装了4.8.1版本的gcc编译器的MinGW编译环境,编译此驱动时,上述错误消失。

由此可知,此问题的解决方案是安装4.6.1以上版本的gcc编译器。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值