Qt 程序在 windows 下的发布
Qt 程序在 windows 下的发布
这个问题,其实 Qt 的 manual 中解释的已经比较清楚了。下面是我根据自己的理解和实验后写的东西,希望比Qt文档容易理解一点。
另外:你可能对 Qt 插件学习(一) 感兴趣。如果需要制作安装程序,请访问NSIS学习笔记(以Qt4程序打包为例)
下面不涉及静态编译(静态编译可以看看这儿),只包含动态编译(也就是Qt默认的情况),主要又分 mingw 和 msvc 两种情况:
Mingw
首先,我们需要生成 release 模式的可执行程序(不少同学抱怨,一个小小程序却需要100多M的动态库,就是因为用的debug)
qmake
mingw32-make release
家庭财产综合保险
而后将 可执行文件 与 需要的动态库放到同一个文件夹下,一般需要
英雄联盟代练封号mingwm10.dll
空手套白狼的意思libgcc_s_dw2-1.dll
qtcore4.dll
qtgui4.dll
有同学抱怨,动态库拷过去以后,程序报错 无法定位程序输入点于动态链接库QtCore4.dll上 ,这一般是由于系统中装了多套Qt的运行库,而你拷贝的不是Qt安装目录下的库所导致的。比如,当安装的是Qt SDK时,很容易导致这个问题,因为里面的Qt是mingw编译的,但里面的QtCreator是msvc编译的,所以不少人不小心就吧QtCreator带的Qt运行库拷过来了。
如果你不需要其他的插件,那么就可以发布程序了,然而不少同学抱怨 jpg、gif、bmp 等
格式的图片无法显示,这是因为 Qt 原生支持 png,而其他格式需要通过插件支持(插件在 %QTDIR%/plugins\imageformats 目录下)
你只需将需要的插件拷贝到可执行程序所在的目录下的 imageformats 目录下即可
imageformats\qjpeg4.dll
imageformats\qgif4.dll
...
同样,如果你的程序需要gb2312、gbk编码支持,那么需要将 %QTDIR%\plugins\codecs 目录下的相应插件拷贝到可执行程序所在目录下的 codecs 目录下
codecs\qcncodecs4.dll
...
建议:不妨多看看Qt安装目录下的plugins目录,熟悉这些插件分别是做什么的,你发布的程序需要哪些。
现在,程序可以发布了。你现在也可以通过 nsis 来制作一个安装包(NSIS学习笔记(以Qt4程序打包为例))。
msvc
如果用的VS2008 而不是mingw,发布的过程其实基本是一样的。
首先生成 release 模式的 可执行文件
qmake
园通快通快递单号查询nmake release
而后准备需要的动态库与插件
qtcore4.dll
属相 楼层qtgui4.dll
imageformats\*4.dll
...
因为是vc编译的,所以不需要mingw的 mingwm10.dll libgcc_s_dw2-1.dll ,取代他们的是VC2008的C\C++ 运行库:
MSVCR90.DLL
MSVCP90.DLL
如果你用的Windows xp 之前的系统,那么只要将这两个运行库和可执行程序放于同一个目录即可。
但对于Windows xp (包括)之后的系统,这样做并不会正常工作,程序会报告:由于应用程
序配置不正确,应用程序未能启动。这个问题有点复杂,其实解决方法很简单,只需在用户机器上安装1M多的VS2008可再发行包 即可
该包会将运行库安装到 window系统目录下的 WinSxS 目录下,对xp之前的系统,还会将运行库同时安装到path路径下的目录内。其实如果用户装过其他人编写的VC2008的程序,机器上很应该已经装过该包了。
或许你要问,如果不想安装 可再发行包怎么办,比如就想把需要dll一块和程序打包,我们可以这么做:
将文件夹 (如果你用的VS2008 express,该文件夹不存在)
赞美母亲<Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC90.CRT
直接复制到可执行程序所在目录
Microsoft.VC90.CRT\*
注意:
如果用户机器上已经安装了可再发行包,程序将永远不会使用Microsoft.VC90.CRT下的库。
当采用这种方法时,如果同时发布插件(包括图片插件等),那么插件编译时必须:
CONFIG-=embed_manifest_dll
使得生成的插件中不嵌入manifest文件,否则插件不被程序识别(其实也可以识别,只要将 Microsoft.VC90.CRT 拷贝一份和插件放到同一文件夹即可,当然这种方式很不好,如果插件分布在几个目录下,要放置Microsoft.VC90.CRT的很多副本)。
工具
1. 一定要记住: Dependency Walker 是你的好帮手,它会告诉你你的 exe 和 dll需要哪些库,以及它加载的动态库都在哪个文件夹内 等
2. 最好准备一个进程查看的工具,比如微软的 Process Explorer等,来查看你的程序到底加载了哪些动态库(加载了哪些插件等)
在一台没有安装Qt的电脑上发布Qt程序(与数据库连接),其方法如下:
(1)直接把DeBug或release中的.exe文件拖出来,直接双击,它需要什么.dll库,就按提示把这些动态链接库出来,在DeBug中生成的.exe一般会需要:
【1.】Mingwm10.dll,  QtCored4.dll,  QtGuid4.dll,  QtSqld4.dll(如果你使用了sql语言的话)
这四个动态连接库是在双击一个拖出来的.exe时会提示我们的。。。。。
注意:若.exe文件在release文件夹中,则需要的分别是Mingwm10.dll,  QtCore4.dll,  QtGui4.dll,  QtSql4.dll这四个动态连接库。更要注意的是这几个动态连接库都是从安装Qt后的生成文件中复制过来的,并且复制的路径应是Qt4.5\qt\bin\,其他地方也有这些动态连接库但是是无效的。
【2】需要这样一个额外的动态连接库:libgcc_s_dw2-1.dll这个动态连接库,不像以上四个,双击.exe时不会提示缺少它,而且在Qt的安装后生成的文件夹中也不到他(反正我的安装目录下没有,我是后来在网上下的)。。。。事实证明这一步不是必须的。。。。
【3】还有就是插件D:\Qt4.5.3\qt\plugins 其中包含一些插件,例如sqldrivers等文件夹里面就有相应的ODBC驱动,如果要用其它数据库驱动,那么可能还要手动添加,里面还有一些驱动文件夹codecs等,这些是用来识别文字的驱动,如果没有它就不能识别文字等会出现乱码现象,还有一些支持声音的文件夹等等。。。。。
【4】可能把上面5个动态连接库和plugins文件夹,以及一个.exe都放在一个文件夹中之后放在比较干净的电脑上仍然不能运行。这很可能是连接不上数据库,不到插件导致的。
【5】这时我们要采取如下措施:
在release文件夹里创建plugins文件夹,并将QT安装目录下的plugins\sqldrivers文件夹复制到release\plugins文件夹(我的程序使用的是SQLite数据库,由于plugins\sqldrivers文件夹里有默认的数据库驱动,所以直接复制过去就可以了,如果是其他数据库可能需要下载其他第三方的sql驱动
然后最重要的一步是在main.cpp中添加以下语句
QApplication::addLibraryPath("./plugins");
编译程序之后再发布就可以了。
1、、、、Qt应用程序的发布
应用程序的发布
应用程序的发布
应用程序的发布
首先需要以release方式编译应用程序,将编译好的程序文件复制到发布文件夹。
其次将以下动态链接库复制到发布文件夹中:
mingwm10.dll、QtCore4.dll、QtGui4.dll。可以从“Qt安装目录\qt\bin”下面到它们。
如果用到了其他功能,如OpenGL,则需要将将将将QtOpenGL4.dll也复制到发布文件夹中。如果应用程序有访问数据库的功能,则不仅要将QtSql4.dll复制到发布文件夹,而且还
需要将对应的数据库驱动程序(同样也是dll)复制过来,放到“发布文件夹\sqldrivers”目录下面。
可以从“Qt安装目录\qt\plugins\sqldrivers”下面到它们,如qsqlite4.dll。
如果应用程序含有中文,还需要在发布文件夹下面建立codecs目录,并将将将将“Qt安装目录\qt\plugins\codecs”目录下面的qcncodecs4.dll复制过来。
对于其他以插件方式提供的功能,如imageformats,也需要像上面的方式将将将将所有需要的dll复制过来。
2.exe文件图标设置首先当然要准备一个.ico图标文件(假定为qtdemo.ico),将其复制到工程目录当中(.pro文件所在的目录)。然后在QT Creator中Ctrl+N或 File - New File or Project,选择General中的Text File,名称填写为.rc文件(如),在里面只用写一行: IDI_ICON1 ICON DISCARDABLE "myIcon.ico" 编辑.pro文件,里面应该有: OTHER_FILES+= \ 在其下再添加一行(如果没有上面的内容也没事): RC_FILE = \  最后编译一下就好了,新生成的exe文件的图标就会变成qtdemo.ico的样子
2、Qt中文显示问题
先在main.cpp文件中加入以下语句,让程序中可以使用中文在其中加入#include<QTextCodec>头文件包含,再在主函数中加入下面一行:QTextCodec::setCodecForTr (QTextCodec::codecForLocale ()); 这样在程序中使用中文,便能在运行时显示出来了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。