2013年3月22日记录为什么发布程序的时候,目标机连接不上主机的MySql数据库(已解决)

成功了!

花了两天时间研究为什么发布程序的时候,目标机连接不上主机的MySql数据库。原来是程序的问题!申明数据库的驱动放在了全局变量,导致了编译的时候已经连接数据库驱动,然后执行的时候肯定找不到驱动了。

这么一说也就解决了为什么在exe同目录下放置了plugins/sqldrivers/qsqlmysql4.dll或者直接放dll文件在plugins下甚至同目录下,然后在main函数里添加那条QCoreApplication::::addLibraryPath(strLibPath);没用,在同目录下写qt.conf没用的(注意这里不是说这些是废的噢)情况。

现在来详细说说整个流程吧。按照我遇到问题的始末来说

我第一个碰到的问题就是没编译好qsqlmysql4.dll,这样会直接在生成release的时候,提示找不到驱动。我就返回到编译MySql的步骤来编译release版本的驱动,我贪图方便,用Qt creator直接载入  Qt安装目录/src/plugins/sqldrivers 下的mySQl.pro文件,然后把Mysql的include和lib文件都放在Qt相应的目录下面,反正提什么错误就改什么,呵呵,弄多了就不怕错误了,最后编译完了去到编译出来的release目录下果然找到了qsqlmysql4.dll和qsqlmysql4.lib。注意不是.a文件,.a的是mingw编译器编译产生的。

至于整个编译的过程,一搜就有了,而且要根据个人情况来配置,啰嗦也没用。最主要的是要知道哪些步骤,这个在Qt的帮助文档里搜SQL database driver,根据文档来操作就行了。而且要体会编译的理念,这个不是别人一说,或者给几条命令就懂了的,还是要经过大量的运用,才能很好的解决,不然出现什么错误提示又要百度了。

接下来,我生成release了,在本地运行没出错。但是在发给别的电脑后,无论把复制qsqlmysql4.dll到什么地方,都给我报driver not load的错误,之后我看到某哥的文章,说“总不能把我的Qt开发环境都装在别人的电脑上吧”,我一想,就马上改了一下自己的Qt的路径,在我的电脑上果然出错了!然后再慢慢细化目录,发现就是  Qt安装目录/plugins/qsqldrivers目录下一定要有qsqlmysql4.dll才行。经过实验,在别的电脑下也新建了这个路径,把文件放进去了。果然没出错!我的乖乖,这样就说明了驱动是没问题的,数据库连接是没问题的!只是发布包里找不到驱动的路径。

然后我狂找相关的资料,发现要解决这个路径的问题,有两个方法:

第一个方法:在程序的同目录下新建个路径plugins/sqldrivers/,里面放qsqlmysql4.dll,然后在main函数中加上

QString strLibPath(QDir::toNativeSeparators(QApplication::applicationDirPath())+QDir::separator()+"plugins");

qApp.addLibraryPath(strLibPath);

这两句话

第二个方法:在同目录下新建一个文本文档,写入

[Paths]
Prefix = .
Plugins = plugins

保存为qt.conf,

Qt程序启动时会用QLibraryInfo类载入qt.conf文件, 按下面的路径顺序搜索 :

  1. 资源系统, :/qt/etc/qt.conf
  2. 执行档所在目录,如:QCoreApplication::applicationDirPath()+QDir::seperator()+”qt.conf”  
这个方法也可以查看文档里的qt.conf。
注意两个方法都要确保程序中数据库驱动的定义一定不能为全局变量,不然就不能把搜索插件的路径更改了,会在Qtcore中找插件路径,所以就找到的是 开发环境的路径,发布给别的电脑就找不到驱动了。

=============================================
在这个过程中,我学到了很多东西,书本是不能照抄的。真要理解了原理才行,比如说全局变量是在编译的时候已经执行了,编译的原理,dll文件的作用,使用dependency walker查看程序所要用到的dll文件等等。
驱动可以理解为发动机,由于这个驱动的存在,上层可以提供统一的接口(一样的方向盘,油门),而不用关心具体的数据库类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值