建议:直接最后一段话是核心重点!!!
使用Qt版本,Based on Qt 5.12.0 (MSVC 2015, 32 bit),系统:win10,数据库:腾讯云服务器安装的MySql(mysql Ver 14.14 Distrib 5.7.36, for Linux (x86_64) )。
一开始并没有在意,在我的debug模式和release模式下,都能连接远程数据库,并增删改查。直到我打包将程序放到裸机上进行测试,发现,提示:drivers not load!,这个提示很熟悉,里面的问题情况也很复杂。
相信每个遇到这个问题的小伙伴,肯定找了n多篇博客,但是解没解决问题,这个就很难说了。废话不多说,先分析问题原因:
00.能出现这个问题,大方向分为两个:其一,Qt自带的(5.12后,据说不带qmysql.dll驱动,需要自己手动编译)qsqlmysql.dll这个文件的问题(不适配);其二,MySql数据库自己本身的libmysql.dll文件(不适配,主要是版本问题);
01.查阅网上资料一大堆,又因为每个人的Qt版本不同,使用的编译器不同,编译器位数不同,数据库版本位数不同等原因,导致这个问题复杂化。
02.首先说明,你的Qt下载安装的时候,无论是32位还是64位,这个问题与此无关。因为Qt只是个造程序的IDE,它32位的也能使用MSVC,MINGW的编译器编译出32位,或64位的软件。只是我们知道64位平台兼容32位的。
03.但是,你所使用的编译器很重要,无论你是mingw还是msvc的编译器,在后续编译源码的时候,需要将MySql的库和头文件引入,所以编译器选择位数很重要。
04.还要搞清楚你现在所使用的MySql数据库的位数,版本,这里的位数版本,指的是你实际使用的(或者说真正连接的数据库)。我的情况就是本地win10没有安装数据库,数据库在云服务器上,但是,使用的Qt是windows系统开发程序,并不是linux。
00.能在网上找到符合自己环境的qmysql.dll,这样最好,否则,就老老实实编译吧。步骤也不难。
给一个参考:
https://blog.csdn.net/qq_38832450/article/details/110452117
这里贴出来我的最后的2个配置文件的配置
1.mysql.pro最终的配置
2.qsqldriverbase.pri最终的配置
在这里做几点说明:
1.按照参考步骤编译的时候,注意你所使用的编译器位数,要和实际使用的MySql数据库位数一致,否则,64位的编译器,引入32位的数据库文件,就会报错。比如:你用MSVC_2017的64位编译器编译自己的程序,那么就要使用MSVC_2017的64位编译器编译qmysql.dll,引入的MySql库文件也必须是64位的库文件,这就是为什么要追求位数一致的原因。在这里,我的数据库版是在linux上安装的,但是我的程序是在windows下开发的,所以还是需要windows下的驱动和对应的版本的数据库的动态库文件(也就是说,虽然数据库在linux上,但是在windows下开发的程序还是需要同版本的动态库文件的,在这里提供下载网址,可以选择自己的版本和平台以及位数:
https://downloads.mysql.com/archives/community/。
2.引入头文件,库文件的时候,注意相对路径写法和绝对路径写法,尤其注意反斜杠。
3.编译出来以后,如果没有指定目标文件(就是输出文件夹),我这次就默认生成在了E盘的根目录下新创键的E:\plugins\sqldrivers文件夹下,而不是在指定的文件夹,这里害得我找了好久,实际我是指定了输出目录的,也可能是配置没有生效。最起码要编译出qsqlmysqld.dll和qsqlmysqld.dll这两个文件。
01.关于qsqlmysqld.dll与 qsqlmysql.dll 有什么区别,qsqlmysqld.dll就是debug下使用的,qsqlmysql.dll 就是release下使用的,一般打包程序以后,只需要把qsqlmysql.dll 放到exe同级的sqldrivers文件夹下,这个sqldrivers文件夹一般打包的时候,只要你使用了数据库,就会自动创建这个文件夹。如果你需要调试(debug)模式,那就把qsqlmysqld.dll 放到编译器对应的plugins/sqldrivers下。
02.把数据库的安装文件路径下的lib文件夹下libmysql.dll文件放到编译器对应的bin文件夹下,bin文件夹下放的是一些相关动态库,所以要使用MySql数据库,那么它的动态库也应拿过来放到bin下。
03.步骤01、02做完以后,测试代码,具体代码网上很多,只要关于数据库的参数不写错,一般不出问题,就是成功。
04.关于release下,有的小伙伴在debug模式下数据库能连接通过,release模式下却出问题了,莫慌,01步骤中说了,要将qsqlmysqld.dll放到编译器对应的plugins/sqldrivers下,那么qsqlmysql.dll也是一个道理,同样放在plugins/sqldrivers下。
05.关于将程序打包以后,连接不上(这也是我本次的bug),首先,打包以后的程序,先确定qmysql.dll驱动(一定是你用当前的编译器,对应编译器位数,编译的对应位数的数据库驱动)在你打包的sqldrivers文件夹下,而后还要将MySql数据库安装文件下的lib文件夹下的libmysql.dll放到exe同级别才能使用(关于libmysqld.dll也很容易看出是debug下使用的,这里不用拷贝)。也就是说:Qt通过qmysql.dll连接数据库,而后在使用libmysql.dll这个动态库。
06.关于debug模式下的动态库是否可以混用release模式下的动态库,一般debug下的库会比release下的库大,这个也是正常的,但是不建议混用。所以,在debug模式下,我们需要将驱动qsqlmysqld.dll与数据库动态库文件libmysqld.dll配套使用;在release模式下,需要将驱动qsqlmysql.dll与数据库动态库文件libmysql.dll配套使用。就是加不加d的问题。
07.关于如何确定,是缺少驱动,还是数据库的动态库文件,一般,使用Qt中drivers函数打印出可使用的驱动,如果没有对应的驱动,那就需要编译驱动。如果驱动存在,但是显示 “drivers not load!”,那也有可能是,一,有驱动,但是驱动不配;二,驱动匹配,只是数据库动态库文件不匹配,数据库动态库文件不匹配,则分为:一,数据库版本不对应,也就是说,libmysql.dll这个文件和你当前使用的数据库版本不对应;二,数据库版本一致,但是位数不一致,可能你的数据库是64位的,但是你拿了一个32位的libmysql.dll文件。