• 10310阅读
  • 1回复

[提问]Qt应用如何发布 [复制链接]

上一主题 下一主题
离线dduyoung
 

只看楼主 倒序阅读 楼主  发表于: 2010-09-28
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2011-01-07) —
通常情况下,使用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时,用它就更加方便了。

——————————————————————————–

以上内容都是一些小常识,也许大家早就明了了。可惜我这个新手在上面还是吃过大亏,希望对遇到类似问题的朋友有一定的帮助。

我的博文:http://blog.romebuilder.com/?p=93
离线XChinux

只看该作者 1楼 发表于: 2010-10-21
在文档中提到的几种方法中,qt.conf感觉比较不错, 呵呵。再把qt.conf放到资源文件里。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个