Qt 程序在 windows 下的发布
2015-11-17 14:29
357 查看
这个问题,其实 Qt 的
manual 中解释的已经比较清楚了。下面是我根据自己的理解和实验后写的东西,希望比Qt文档容易理解一点。
另外:你可能对
Qt 插件学习(一) 感兴趣。如果需要制作安装程序,请访问
NSIS学习笔记(以Qt4程序打包为例)
下面不涉及静态编译(静态编译可以看看这儿),只包含动态编译(也就是Qt默认的情况),主要又分 mingw 和 msvc 两种情况:
而后将 可执行文件 与 需要的动态库放到同一个文件夹下,一般需要
myprogram.exe
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 目录下即可
myprogram.exe
imageformats\qjpeg4.dll
imageformats\qgif4.dll
...
同样,如果你的程序需要gb2312、gbk编码支持,那么需要将 %QTDIR%\plugins\codecs 目录下的相应插件拷贝到可执行程序所在目录下的 codecs 目录下
myprogram.exe
codecs\qcncodecs4.dll
...
建议:不妨多看看Qt安装目录下的plugins目录,熟悉这些插件分别是做什么的,你发布的程序需要哪些。
现在,程序可以发布了。你现在也可以通过 nsis 来制作一个安装包(NSIS学习笔记(以Qt4程序打包为例))。
首先生成 release 模式的 可执行文件
而后准备需要的动态库与插件
myprogram.exe
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可再发行包vcredist_x86.exe
即可
该包会将运行库安装到 window系统目录下的 WinSxS 目录下,对xp之前的系统,还会将运行库同时安装到path路径下的目录内。其实如果用户装过其他人编写的VC2008的程序,机器上很应该已经装过该包了。
或许你要问,如果不想安装 可再发行包怎么办,比如就想把需要dll一块和程序打包,我们可以这么做:
将文件夹 (如果你用的VS2008 express,该文件夹不存在)
直接复制到可执行程序所在目录
myprogram.exe
Microsoft.VC90.CRT\*
注意:
如果用户机器上已经安装了可再发行包,程序将永远不会使用Microsoft.VC90.CRT下的库。
当采用这种方法时,如果同时发布插件(包括图片插件等),那么插件编译时必须:
使得生成的插件中不嵌入manifest文件,否则插件不被程序识别(其实也可以识别,只要将 Microsoft.VC90.CRT 拷贝一份和插件放到同一文件夹即可,当然这种方式很不好,如果插件分布在几个目录下,要放置Microsoft.VC90.CRT的很多副本)。
Dependency Walker 是你的好帮手,它会告诉你你的 exe 和 dll需要哪些库,以及它加载的动态库都在哪个文件夹内 等
转载:zhezhelin
http://www.cnblogs.com/cute/archive/2012/02/27/2369926.html
manual 中解释的已经比较清楚了。下面是我根据自己的理解和实验后写的东西,希望比Qt文档容易理解一点。
另外:你可能对
Qt 插件学习(一) 感兴趣。如果需要制作安装程序,请访问
NSIS学习笔记(以Qt4程序打包为例)
下面不涉及静态编译(静态编译可以看看这儿),只包含动态编译(也就是Qt默认的情况),主要又分 mingw 和 msvc 两种情况:
Mingw
首先,我们需要生成 release 模式的可执行程序(不少同学抱怨,一个小小程序却需要100多M的动态库,就是因为用的debug)qmake mingw32-make release
而后将 可执行文件 与 需要的动态库放到同一个文件夹下,一般需要
myprogram.exe
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 目录下即可
myprogram.exe
imageformats\qjpeg4.dll
imageformats\qgif4.dll
...
同样,如果你的程序需要gb2312、gbk编码支持,那么需要将 %QTDIR%\plugins\codecs 目录下的相应插件拷贝到可执行程序所在目录下的 codecs 目录下
myprogram.exe
codecs\qcncodecs4.dll
...
建议:不妨多看看Qt安装目录下的plugins目录,熟悉这些插件分别是做什么的,你发布的程序需要哪些。
现在,程序可以发布了。你现在也可以通过 nsis 来制作一个安装包(NSIS学习笔记(以Qt4程序打包为例))。
msvc
如果用的VS2008 而不是mingw,发布的过程其实基本是一样的。首先生成 release 模式的 可执行文件
qmake nmake release
而后准备需要的动态库与插件
myprogram.exe
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可再发行包vcredist_x86.exe
即可
该包会将运行库安装到 window系统目录下的 WinSxS 目录下,对xp之前的系统,还会将运行库同时安装到path路径下的目录内。其实如果用户装过其他人编写的VC2008的程序,机器上很应该已经装过该包了。
或许你要问,如果不想安装 可再发行包怎么办,比如就想把需要dll一块和程序打包,我们可以这么做:
将文件夹 (如果你用的VS2008 express,该文件夹不存在)
<Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC90.CRT
直接复制到可执行程序所在目录
myprogram.exe
Microsoft.VC90.CRT\*
注意:
如果用户机器上已经安装了可再发行包,程序将永远不会使用Microsoft.VC90.CRT下的库。
当采用这种方法时,如果同时发布插件(包括图片插件等),那么插件编译时必须:
CONFIG-=embed_manifest_dll
使得生成的插件中不嵌入manifest文件,否则插件不被程序识别(其实也可以识别,只要将 Microsoft.VC90.CRT 拷贝一份和插件放到同一文件夹即可,当然这种方式很不好,如果插件分布在几个目录下,要放置Microsoft.VC90.CRT的很多副本)。
工具
1. 一定要记住:Dependency Walker 是你的好帮手,它会告诉你你的 exe 和 dll需要哪些库,以及它加载的动态库都在哪个文件夹内 等
转载:zhezhelin
http://www.cnblogs.com/cute/archive/2012/02/27/2369926.html
相关文章推荐
- Qt显示界面旋转
- qt相关知识点
- QT生成跨平台可执行文件
- Qt动画框架设计飞入-消失特效
- Qt动画框架的学习
- QT解决中文乱码显示问题
- Qt中的事件
- CLion+Qt5环境配置
- qt 信号连接方式
- Ⅰ.2.5 如何使用Qt Signal Handles
- Ⅰ.2.4 如何使用Qt Convenience API
- Ⅰ.2.3 如何访问Qt枚举型
- Ⅰ.2.2 如何调用Qt对象的函数
- Ⅰ.2.1 如何访问Qt对象
- 在Qt中怎样显示ASCII码大于127的字符
- Qt环境搭建(Visual Studio)
- Qt环境搭建(Visual Studio)
- QT 的信号与槽
- 44篇QT blog(包括按钮发黑、内存泄漏、程序退出等一系列问题)和24篇QT blog
- Ⅰ.2.6 如何测试Qt Widgets