通常情况下,使用Qt开发应用都是采用动态编译的方式来进行发布,发布应用的时候就需要将相应的动态链接库文件一起发布了。应用依赖于哪些dll 文 件呢?一般来讲,有QtCore4.dll、QtGUI4.dll之类的了。但是,由于应用可能涉及到其它的模块,如网络模块等。可以查看一个.pro文 件了解应用具体涉及到哪些模块。还有一个办法是,如果安装了VC6,则可以使用depends命令打开一个依赖查看工具,直接打开你的exe文件便可看到 它所依赖的dll文件。复制出来即可,放在exe文件所在的目录即可。
另外还有一部分,是插件,这些插件是depends工具显示不出来的依赖关系,因为只有在应用运行的时候才会动态地去加载。这也是为什么很多跟我一样的新手会遇到“找不到数据库驱动”,“乱码”等问题的原因。
在 Qt的安装目录中有一个plugins的目录,这个目录放着一些常用的插件,有数据库驱动、文字编码插件、图像解析等方面的,也基本上一个完整应 用所必需的——因为你总会在应用中使用数据库,中文,使用图片等(尽管不是一定有这些操作)。发布应用时,你需要把你使用到的插件带上,你会把 plugins目录下的一些dll文件直接复制出来,与exe文件放在一起,或者在再新建一个plugins目录用于放置插件文件。在应用中使用 QApplication::addLibraryPath(“./”)或者QApplication::addLibraryPath(“. /plugins”)。但还是解决不了找不到插件的问题。
根据官方的说明:
假设你的应用app.exe位于appdir目录,如下:
+appdir
-app.exe
那么,appdir目录其实就等同于plugins目录。也就是说,当你应用运行的时候,它会在appdir目录下面找qt的插件。但是,Qt的插件是按不同的目录放置的,当你从Qt的安装文件目录下复制插件时,还需要创建相应的目录结构。如下,使用数据库插件:
+appdir
-app.exe
+sqldrivers
-qsqlite4.dll
现在即便不使用QApplication::addLibraryPath(“./”),也可以找到数据库驱动了。
或者使用QApplication::addLibraryPath(“./plugins”),将目录结构建成如下的样子,也是可以的:
+appdir
-app.exe
+plugins
+sqldrivers
-qsqlite4.dll
这样也是正常运行的。重要的,其实是只有一点。使用qt的插件时,要注意带上相应的目录。如果有一点Qt插件开发的经验的话,理解起来就比较方便吧。
还 有需要提醒的一点,就是图片、文字编码的插件。使用起来和上面的例子一样,只是容易被忽略掉。等到发布应用后,发现乱码了,或者是按钮上的图片显 示不了等问题是,就应该想到这一点。开发的时候一切正常,在没有Qt环境的机器上测试的时候,怎么就都不正常了呢?八成就是少了这些插件。
另外,在Windows环境上开发,可以使用SysinternalsSuite工 具来查看应用在运行时具体依赖了哪些dll文件。它是微软提供的一套开发小工具集合。其中的process explorer工具可以查看系统进程并显示出这个进程使用到的dll以及dll所在的目录。当应用加载不了dll,或者加载了错误的dll时,用它就更 加方便了。
——————————————————————————–
以上内容都是一些小常识,也许大家早就明了了。可惜我这个新手在上面还是吃过大亏,希望对遇到类似问题的朋友有一定的帮助。