关于在windows下部署发布QT程序的总结
原文请看:http://www.cnblogs.com/javaexam2/archive/2011/05/18/2632916.html
以下包括了部分网上收集的,以及qt帮助里的内容(Deploying an Application on Qt/Windows)
部署发布QT程序有两种方法:
第一种,静态编译,可生成单一的可执行文件。
第二种,动态编译,需同时附上需要的dll文件。
一、静态编译
1 编译QT。
要静态编译,首先要求QT是静态编译过的。在QT目录下执行:
configure.exe -static -release
make sub-src
就可以编译出静态库。如果只是用来分发程序,也可以mingw32-make release sub-src只编译一个静态库。
这个过程需要1-2个小时。QT目录会变成1.8G左右。注:mingw32-make和make是一样的。
如果用VC2005平台,在编译Qt的时候,configure.exe -static -platform win32-msvc2005
然后nmake sub-src或者nmake release sub-src完成静态编译。
2 编译程序。
然后到你自己的程序目录下执行:
make clean
qmake -config release
make
这时会得到一个非常大的可执行程序,但也会有一个重要的问题,就是图片文件显示不出来。
按照QT帮助的说法,QT里的jpeg,gif等图片的支持都是以插件的形式存在的,现在我们还没有包含任何插件。
3 加入插件
在main.cpp里:
#include <QApplication>
#include <QtPlugin> //这个
Q_IMPORT_PLUGIN(qjpeg) //这个
Q_IMPORT_PLUGIN(qgif) //这个
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
…
return app.exec();
}
在.pro里加入:
QTPLUGIN += qjpeg qgif
CONFIG += static
QT的帮助里就做到这里,但我编译程序时出错如下:
release/main.o(.text+0×1c9):main.cpp:
undefined reference to `qt_plugin_instance_qgif()’
undefined reference to `qt_plugin_instance_qjpeg()’
经过长时间研究,发现了解决问题的办法:
4 加入LIBS
在.pro中加入:
LIBS += C:/Qt/4.3.3/plugins/imageformats/libqgif.a
LIBS += C:/Qt/4.3.3/plugins/imageformats/libqjpeg.a
如果QT静态编译正确的话,你应该上面这个目录下看到这两个文件libqgif.a和libqjpeg.a (据说以前的QT版本也可能是.lib或.o文件)
这时已经可以正常编译运行了。但还是需要mingwm10.dll才能运行。
5 解决MinGW的mingwm10.dll依赖问题
在Makefile.release里找到:
LFLAGS
= -enable-stdcall-fixup -Wl,-enable-auto-import
-Wl,-enable-runtime-pseudo-reloc -static -Wl,-s -Wl -mthreads -Wl,
-subsystem,windows
删除其中的”-mthreads”
quote:
一
般只有用到threads的时候才用到mingwm10.dll,我们通常遇到的”缺少mingwm10.dll”问题,可以在程序qmake生成
makefile.release文件后删除”-mthreads”参数即可,一般在
“LFLAGS”后面。当然,这只是临时解决方案,每次都要手动修改,也可以在编译QT前先修改qmake.h,不过不推荐这种方法。其实,
mingwm10.dll也就十多K,每次发布程序时一起打包也无所谓。
更多信息可以参考:
http://lists.trolltech.com/qt-interest/2006-08/thread00942-0.html
http://lists.trolltech.com/qt-interest/2005-10/thread00381-0.html#msg00553
这时编译同样得到一个非常大的可执行程序(我写的这个贪吃蛇一共500多行,生成的exe有8M)。用AspPack压缩一下。就可以发给用户了(这时是2.6M)。
quote: “这样编译出来的程序比较大,可以先用strip命令去掉程序里面一些无用信息后,用ASPack或者UPX之类的压缩加壳软件压缩一下,两者的压缩率基本都达到30%多一点,压缩效果还是很明显的。”
二、动态编译
动态编译就很容易了。用QT的默认安装,把生成的release下的exe文件,和下面几个核心文件放在一个文件夹里:
MINGWM10.DLL
QTGUI4.DLL
QTCORE4.DLL
VC2005编译程序运行时需要的几个dll文件
Microsoft.VC80.CRT.manifest 位于x:/Program Files/Microsoft Visual Studio 8/VC/redist/x86//Microsoft.VC80.CRT
msvcm80.dll
msvcp80.dll
msvcr80.dll
QtCore4.dll
QtGui4.dll
这样就可以运行了。但图片文件还是可能显示不出来,解决办法:
把程序文件夹里,建立一个imageformats目录(必须是这个名字),把qt目录下的plugin/imageformats目录下对应的dll文件copy过去。这样动态连接就完成了。
注:可以用微软的Dependency Walker tool工具,就是一个depends.exe的程序,来查看一个exe文件跟哪些dll关联。
注:需要在完全没有装QT的系统上测试发布的程序有没有DLL依赖问题。
关于在windows下部署发布QT程序的总结的更多相关文章
- QT程序在windows下部署发布
转载:http://www.cnblogs.com/Fan_Fan/archive/2010/05/29/1746860.html QT程序在windows下部署发布 以下包括了部分网上收集的,以及q ...
- Linux下如何发布Qt程序
在X11平台下qt程序,首先准备好程序中需要使用的资源,库和插件... 比如你的可运行程序取名叫作panel,那把你的panel,那些libQt*.so.4和libQt*.so.4.6.0(链接 ...
- Qt技巧:Win7下打包发布Qt程序(解释的比较清楚,把exe和dll伪装合并成一个文件)
转自:http://www.stardrad.com/blog/qt-5%E7%A8%8B%E5%BA%8F%E5%9C%A8windows%E4%B8%8A%E7%9A%84%E5%8F%91%E5 ...
- [置顶] Linux下发布QT程序
Linux下发布QT程序 概述 无论在windows下还是在linux下,可执行程序的运行都依赖于相关的运行库,我们需要将依赖的库找到放到特定的位置,让可执行文件能够找到.在不知道可执行文件依赖哪些库 ...
- 在Linux下使用linuxdeployqt发布Qt程序
一.简介 linuxdeployqt 是Linux下的qt打包工具,可以将应用程序使用的资源(如库,图形和插件)复制到二进制运行文件所在的文件夹中. 二.安装linuxdeployqt 去github ...
- linux centos7 和 windows下 部署 .net core 2.0 web应用
centos7 下部署asp.net core 2.0应用 安装CentOS7 配置网络[可选] 安装.Net core2.0 创建测试Asp.net Core应用程序 正式部署项目 安装VMware ...
- windows 下部署 .netcore 到 docker
前面我们演示了如何将 Asp.Net Core 程序部署到 iis 和 部署到 windows 服务.其实前面的都是铺垫,如何将 Asp.Net Core 站点部署到 docker 才是这个系列文章的 ...
- windows 下部署 .netcore 到 windows service
接上一篇 <windows 下部署 .netcore 到 iis>,这一篇记录一下怎么将 Asp.Net Core 以 windows 服务的方式部署. 一.修改代码 其实也很简单,只要调 ...
- windows下调用外部exe程序 SHELLEXECUTEINFO
本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: type ...
随机推荐
- ListBox, ListView, GridView
ListView是ListBox的派生类,而GridView是ViewBase的派生类 ListView的View属性是ViewBase,所以GridView可以作为ListView的属性 如 < ...
- [洛谷P2852] [USACO06DEC]牛奶模式Milk Patterns
洛谷题目链接:[USACO06DEC]牛奶模式Milk Patterns 题目描述 Farmer John has noticed that the quality of milk given by ...
- 知问前端——cookie插件
Cookie是网站用来在客户端保存识别用户的一种小文件.一般可以保存用户登录信息.购物数据信息等一系列微小信息. 一.使用cookie插件 官方网站:http://plugins.jquery.com ...
- 51nod 1363 最小公倍数之和 ——欧拉函数
给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66. 由于结果很大,输出Mod 1000 ...
- 【51NOD-0】1008 N的阶乘 mod P
[算法]简单数学 [题解]多项式展开:(a*b)%p=(a%p*b%p)%p #include<cstdio> #include<algorithm> #define rep( ...
- 2016-2017 2 20155335《java程序设计》第四周总结
# 20155335 <Java程序设计>第四周学习总结 ## 教材学习内容总结 继承,在本职上是特殊到一般的关系,即is—a关系,子类继承父类,表明子类是一种特殊的父类,并且具 ...
- bzoj 2440 dfs序
首先我们可以做一遍dfs,用一个队列记录每个点进出的顺序,当每个点访问的时候que[tot++]=x,记为in[x],当结束dfs的时候que[tot++]=x,记为out[x],这样处理出来的队列, ...
- js 数组&字符串 去重
Array.prototype.unique1 = function() { var n = []; //一个新的临时数组 for(var i = 0; i < this.length; i++ ...
- 广度优先算法(BFS)与深度优先算法(DFS)
一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...
- Java中基于HotSpot虚拟机的垃圾收集器
名称 过程 优缺点 Serial 进行垃圾收集时,必须暂停其他所有的工作进程,直到它收集结束.是一个单线程收集器. Stop the world. 新生代收集器. 手工设置新生代的大小:-Xmn Ed ...