.
Qt虽然比VC简单易用,但还是常常出现一些让人费解的事情。
这几天在公司写一个人力资源管理的软件,算是实习期的小试练,用到了MySQL数据库。
程序最基本的功能已经完成了,今天Line Manager 让我们把写好的程序送到测试人员去测试。
.
然后意想不到的问题发生了,在我自己的电脑上运行正常的程序到了测试人员的电脑上就罢工。
把所有和Qt运行环境相关的Dll库全部考到程序运行目录下,还是不解决问题。
经过几个同事的测试,大致结果是,有装Qt的机子有可能能运行,没装Qt的机子必出问题..
一个新同事帮我更加直接的证明了这点,如果将Qt安装目录改名或者去除访问权限,那么程序在我的电脑上也跑不走啦..
.
带着纠结的心情回家,调了一个下午居然没调出一个能独立测试的程序来。
晚上决定逐步缩小搜查范围,经过几轮实验,最后就将问题锁定在MySQL的驱动文件qsqlmysql4.dll上了。
但是这个问题比原想的蹊跷,因为即使将qsqlmysql4.dll文件复制到程序的同一目录下还是不能解决程序独立运行的问题。
.
开始怀疑Qt在注册表里写了什么东西,在注册表里把qsqlmysql4.dll所在的路径放进去搜索,结果一无所获。
那就只能是Qt把什么东西写到程序的exe文件里面去了,这个没办法..可是总能在每个需要移植的计算机上都建一个和我一样的qsqlmysql4.dll目录再把驱动文件放进去吧,这样的话,Qt的MySQL程序就接近为难以移植的了。
.
结果还是在CSDN上找到高人了..
原帖:http://blog.csdn.net/NRC_DouNingBo/archive/2010/06/29/5701586.aspx
不过经过实验,实际的解决方法可以比这篇博客里写的更简单些。。
.
只需要在当前程序的目录下面建一个名为sqldriverss的目录(必须这个名称),然后将qsqlmysql4.dll驱动文件拷进去,然后不论Qt的安装目录怎么改名、移动,都不会影响程序的运行了,当然还要拷贝Qt运行的基本dll文件到程序目录下。
很悲剧的是不论Qt Assistant里面或者网上相关的说明里面都没提到过,Qt的数据库驱动必须放在名字是sqldriverss的目录,NB的Qt,NB的Bug。
.
PS: 窦宁波大哥哥的那篇文章的这种写法还是很有参考价值的.
QString strLibPath(QDir::toNativeSeparators(QApplication::applicationDirPath())
+QDir::separator()+"plugins");
qApp.addLibraryPath(strLibPath);
比如可以把一堆dll文件放到程序目录下的一个自建目录里面,比如runtime,这样就避免了一大堆dll文件和程序在一起了,值得提倡。