Qt软件打包发布(QT5.4.1(msvc2013_64_opengl),Win7 64bit)
环境:QT5.4.1(msvc2013_64_opengl),Win7 64bit
编译方式
Qt开发的程序发布的时候经常采用两种方式:1)静态编译,可生成单一的可执行文件;2)动态编译,需同时附上需要的dll文件。
静态编译
静态编译,是指把相关的库也一并引入exe文件,这样程序的尺寸就会很大,不过程序发布就会变得简单很多。
动态编译(Qt默认)
动态编译,是指相关的库,以dll动态链接库的形式引用。动态编译的exe程序比较小,因为相关的库都没有包含进来。所以程序发布的时候要把相关的库也一并发布出去。
一般使用动态编译动态链接Qt库,尤其代码规模比较大,需要多人协作开发时,不同模块按dll划分比较方便,采用静态链接是不现实的。
Debug版本
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 版本
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的。一般来说,release版的可执行程序体积要比debug版小很多,而且由于剥离了许多调试信息及符号等,运行效率相对也高一些,因此一般采用release编译。
打包发布
本文采用Qt动态编译,release版本的程序。需要将相应的dll跟Qt可执行程序exe文件放在一个目录下。如下例所示:


所需的dll文件包括:
1、C Runtime库msvcrt,使用VC编译的C或C++程序,都需要相关的C runtime库才能运行,如该例程中的msvcp120.dll,msvcr120.dll等;
2、icudt53.dll、icuin53.dll、icuuc53.dll、Qt5Widgets.dll、Qt5Core.dll、Qt5Gui.dll等 (Qt 的bin目录中)动态引用的Qt库;
3、platforms、imageformats、audio等运行时加载的dll 文件夹;
4、程序中引用的第三方库,如QWT,openCV,第三方库的dll文件如qwt.dll、opencv_world300.dll。
将exe文件在另一台电脑上运行时,若缺少运行所必需的dll文件,会报错——缺少dll文件。
C Runtime库
问题比较多的是VC的运行时库 msvcrt。使用VC编译的C或C++程序,都需要相关的C runtime库才能运行。本文采用的是VS2013编译器,对应的就是MSVCR120。进入Microsoft.VC120.CRT 目录:${VS Install Dir}\VC\redist\x64\Microsoft.VC120.CRT,就能找到C runtime库(msvcp120.dll,msvcr120.dll,vccorlib120.dll)。
从vc2005开始微软加入了manifest机制控制运行时库的加载,如果用户机器上未安装过msvcrt的distribution pack,程序就不能运行。简单的处理方法是把C runtime库一并包含进去,即将Microsoft.VC120.CRT 目录下的文件(msvcp120.dll,msvcr120.dll,vccorlib120.dll)放到exe相同的目录即可。应用程序如果找不到系统安装的msvcrt,就会加载自带的库文件。
Qt库
编译Qt后,将Qt生成路径(..\build-untitled-Desktop_Qt_5_4_1_MSVC2013_OpenGL_64bit-Release\release)中的exe程序放到新建的package中,Qt程序中使用到的(在.pro文件中添加的)QtCore,QtGUI,xml,sql,multimedia等相关的动态库和调用它的exe一起放在同一个目录中。
Qt的图片解码库比如jpeg、gif解码等是以插件形式存在的,要包含imageformats文件夹中的dll文件,还有windows平台相关的platforms,windows中的语音相关的audio等文件夹中包含的dll文件。
对于采用动态编译的Qt可执行程序,如果不确定该程序使用了哪些必要的dll,可以使用工具查看该Qt可执行程序使用了哪些dll。
工具
1、 查找程序运行依赖的dll文件
最简单的方式是用Qt自带的生成必备dll文件的windepolyqt工具:
windepolyqt xxx.exe
如果将Qt的bin目录加入PATH环境,就可以直接在命令行使用windeployqt调用。将生成的xxx.exe可执行文件复制到一个空的文件夹里,进入这个文件夹 ,运行windeployqt xxx.exe,则该执行文件需要的大部分依赖文件都自动拷贝到这个文件夹里了。

如果还使用了其他的第三方的SDK,如QWT,OpenCV等,就需要手动将所需dll拷贝过来,如果不知道还需要哪些dll文件,可以用Dependency Walker (depends.exe)和 微软的 procexp.exe 来查看程序运行时还缺少哪些dll。

2、 一个Qt的安装包制作工具,用户打包程序,变成(桌面)安装包,如开源工具Inno Setup(http://www.jrsoftware.org/isinfo.php)进行打包。
这样之后,就得到了一个在其它没有安装Qt和VS的电脑上也可以运行的Qt程序安装包了。
Qt软件打包发布(QT5.4.1(msvc2013_64_opengl),Win7 64bit)的更多相关文章
- Qt 程序打包发布总结
1. 概述 当我们用QT写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行.编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安装 ...
- Qt开发北斗定位系统融合百度地图API及Qt程序打包发布
Qt开发北斗定位系统融合百度地图API及Qt程序打包发布 1.上位机介绍 最近有个接了一个小型项目,内容很简单,就是解析北斗GPS的串口数据然后输出经纬度,但接过来觉得太简单,就发挥了主观能动性,增加 ...
- Qt程序打包发布方法(使用官方提供的windeployqt工具)
Qt程序打包发布方法(使用官方提供的windeployqt工具) 转自:http://tieba.baidu.com/p/3730103947?qq-pf-to=pcqq.group Qt 官方开发环 ...
- 在QT C++中调用 Python并将软件打包发布(裸机可运行)
为了提高工作效率,需要一个可以自动生成多份相关联的word文档免去繁琐复制粘贴工作的软件.最后选定使用QT C++做界面和主要逻辑程序设计,对word的操作使用python写好对应的函数,然后在QT中 ...
- Qt之打包发布(NSIS详解)
来源:http://blog.sina.com.cn/s/blog_a6fb6cc90101fer8.html 发布方式 Qt发布的时候,通常使用两种方式: (1)静态编译 (2)动态编译 ...
- QT程序打包发布
本来感觉这是一个简单的操作,今天看见群里有人在问这个问题,他说网上查了很多都不成功,突然就想把自己初学的时候记录一下! 题目谢了QT程序的打包发布,那就是两步骤:打包+发布! 注释:这篇博文用的是Qt ...
- qt 软件打包
今天呈现的客户端完成了要打包发布,想了一下还不会,就问了一下度娘,在此记录一下学习的程度 1>将QT编译工具的BUG模式切换成Release模式,在Release模式下生成一个*.exe的可执行 ...
- Qt 程序打包发布
Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,Qt 官方开发环境里自带了一个工具:windeployqt.exe.在Qt安装目录如:C:\Qt\Qt5.7. ...
- Qt 程序打包发布总结 转
1. 概述 当我们用QT写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行.编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安装 ...
随机推荐
- 【转】__ATTRIBUTE__ 你知多少
__ATTRIBUTE__ 你知多少? GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属性(Function Attribute ).变量属性(V ...
- java之初学线程
线程 学习线程相关的笔记,前面写过关于很多线程的使用,有兴趣的可以去了解下 线程 概念理解 并发 : 指两个或多个事件在同一个时间段内发生(交替执行). 并行 : 指两个或多个事件在同一时刻发生(同时 ...
- bug -- android 7.0 popwindow显示位置异常情况解决
android 7.0 popwindow显示位置异常,在android7.1官方进行解决了,但是还是要多7.0的bug进行解决,我的解决方案里面通过重写popwindow进行适配: import a ...
- 【codeforces gym】Increasing Costs
Portal --> Increasing Costs Description 给你一个\(n\)个点无重边无自环的无向连通图,每条边有一个边权,对于每一条边,询问去掉这条边之后有多少个点到\( ...
- 【数学/贪心/DP】【CF1088E】 Ehab and a component choosing problem
Description 给定一棵 \(n\) 个节点的树,点有点权 \(a_u\),可能为负.现在请你在树上找出 \(k~(1~\leq~k~\leq~n)\) 个不相交集合,使得每个集合中的每对点都 ...
- 从新浪JS服务器获得股票和股指深度行情(.NET)
当我们需要通过网络来自动获取股指或股票的深度行情时,一般有以下两种方法可以获得.目前除了使用Python进行爬虫获取(需要解析html获得)外还可以通过新浪提供的JS行情服务器获得,本文采用的是后者( ...
- python学习(22) 访问数据库
原文链接:http://www.limerence2017.com/2018/01/11/python22/ 本文介绍python如何使用数据库方面的知识. SQLite SQLite是一种嵌入式数据 ...
- HDU1532最大流 Edmonds-Karp,Dinic算法 模板
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- winscp以命令行方式同步服务器数据到PC机磁盘上
目前服务器上每日会产生备份文件,需要使用winscp工具把备份同步到本地PC机硬盘上.平时都是图形界面用鼠标点击方式来同步的,效率低下,因此编写了winscp自动同步脚本,并加入到计划任务中定时自动运 ...
- 数据科学的完整学习路径—Python版(转载)
时间 2015-01-29 14:14:11 数盟原文 http://dataunion.org/?p=9805 译者: Allen 从Python菜鸟到Python Kaggler的旅程(译注: ...