解析 Qt 程序在Windows 下发布
原文请看:http://www.cnblogs.com/elect-fans/archive/2012/03/15/2408579.html
Qt 程序在Windows下发布是本文要介绍的内容,不多说了,先来看内容,针对这个问题,其实 Qt 的 manual 中解释的已经比较清楚了。下面是我根据自己的理解和实验后写的东西,希望比Qt文档容易理解一点。
下面不涉及静态编译(静态编译可以看看这儿),只包含动态编译(也就是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 来制作一个安装包。
- 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\*
注意:
(1)如果用户机器上已经安装了可再发行包,程序将永远不会使用Microsoft.VC90.CRT下的库。
(2)当采用这种方法时,如果同时发布插件(包括图片插件等),那么插件编译时必须:
- CONFIG-=embed_manifest_dll
使得生成的插件中不嵌入manifest文件,否则插件不被程序识别(其实也可以识别,只要将 Microsoft.VC90.CRT
拷贝一份和插件放到同一文件夹即可,当然这种方式很不好,如果插件分布在几个目录下,要放置Microsoft.VC90.CRT的很多副本)。
工具
1. 一定要记住: Dependency Walker 是你的好帮手,它会告诉你你的 exe 和 dll需要哪些库,以及它加载的动态库都在哪个文件夹内 等

2. 最好准备一个进程查看的工具,比如微软的 Process Explorer等,来查看你的程序到底加载了哪些动态库(加载了哪些插件等)

小结:关于解析 Qt 程序在Windows 下发布的内容介绍完了,希望本文对你有所帮助。
解析 Qt 程序在Windows 下发布的更多相关文章
- QT程序在windows下部署发布
转载:http://www.cnblogs.com/Fan_Fan/archive/2010/05/29/1746860.html QT程序在windows下部署发布 以下包括了部分网上收集的,以及q ...
- Qt 程序在 Windows 下的发布
本文讨论在 Windows 平台下编译成功的 Qt 程序,如何在未配置 Qt 开发环境的 Windows 平台下独立运行的方法. 经过验证发现,在 Ubuntu 平台下编译成功的程序可在未安装 Qt ...
- 原创 C++应用程序在Windows下的编译、链接:第一部分 概述
本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...
- C++应用程序在Windows下的编译、链接(一)概述
C++应用程序在Windows下的编译.链接(一)概述 本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 c ...
- 解决Qt程序在Linux下无法输入中文的办法
解决Qt程序在Linux下无法输入中文的办法 一位网友问我怎样在Linux的Qt的应用程序中输入中文,我一開始认为不是什么问题,可是后面自己尝试了一下还真不行.不仅是Qt制作的应用程序,就连Qt Cr ...
- 【Qt开发】解决Qt程序在Linux下无法输入中文的办法
解决Qt程序在Linux下无法输入中文的办法 一位网友问我如何在Linux的Qt的应用程序中输入中文,我一开始觉得不是什么问题,但是后面自己尝试了一下还真不行.不仅是Qt制作的应用程序,就连Qt Cr ...
- 原创 C++应用程序在Windows下的编译、链接:第三部分 静态链接(二)
3.5.2动态链接库的创建 3.5.2.1动态链接库的创建流程 动态链接库的创建流程如下图所示: 在系统设计阶段,主要的设计内容包括:类结构的设计以及功能类之间的关系,动态链接库的接口.在动态链接库中 ...
- 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构
2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. ...
- VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...
随机推荐
- 不可不知的robots.txt文件
robots.txt基本介绍 robots.txt是一个纯文本文件,在这个文件中网站管理者可以声明该网站中不想被robots访问的部分,或者指定搜索引擎只收录指定的内容. 当一个搜索机器人(有的叫搜索 ...
- Eclipse srever起来时,时间超过45s。
双击servere的名字,在属性界面上进行修改. 如下图: 修改TimeOut中的值即可.
- Android SearchView结合Filter实现列表检索功能使用总结
下面贴出主要代码: <span style="font-size:14px;"> public class MainActivity ex ...
- poi-对于word的操作(二)
poi对于word文本的底纹和下划线的样式的展现 package poi.test; import java.io.FileOutputStream; import java.math.BigInte ...
- mysql binlog日志手动清除
purge binary logs to 'mysql-bin.000050'; set global expire_logs_days=7; flush logs;
- 【Codeforces370E】Summer Reading [构造]
Summer Reading Time Limit: 20 Sec Memory Limit: 512 MB Description Input Output Sample Input 7 0 1 ...
- Atlantis(POJ1151+线段树+扫描线)
题目链接:http://poj.org/problem?id=1151 题目: 题意:求所有矩形的面积,重合部分只算一次. 思路:扫描线入门题,推荐几篇学扫描线的博客: 1.http://www.cn ...
- 土司论坛nc反弹神器使用方法
说明: PS:我本机是linux,因为没有服务器所以使用win7来演示.倘若你是windows可以在本机生成dll以后再放到服务器上面去执行dll即可反弹shell物理机ip:192.168.1.12 ...
- static class 和 non static class 的区别
static class non static class 1.用static修饰的是内部类,此时这个 内部类变为静态内部类:对测试有用: 2.内部静态类不需要有指向外部类的引用: 3.静态类只能访问 ...
- Win10打开照片提示“无效的注册表值”解决方法
1.点开开始菜单,右键单击,选择“以管理员运行”[键盘win键+R]输入PowerShell. 2.输入Get-AppxPackage *photo* | Remove-AppxPackage后回车. ...