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编译器。