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写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行.编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安装 ...
随机推荐
- Udp广播的发送与接收(C#+UdpClient) 上篇
简介: Udp广播消息用在局域网的消息传递很方便.本文使用UdpClient类在WPF下实现Udp广播收发 发送: void MainWindow_Loaded(object sender, Rout ...
- Mininet 系列实验(二)
实验内容 分别通过命令行创建.Python脚本编写以及交互式界面创建来熟悉Mininet的基本功能. 参考 Mininet命令延伸实验扩展 实验环境 虚拟机:Oracle VM VirtualBox ...
- 洛谷 P3797 妖梦斩木棒 解题报告
P3797 妖梦斩木棒 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的\(n\)段.现在这个木棒可以看做 ...
- Button 或 ImageButton 背景设为 透明 或半透明 (转)
半透明<Button android:background="#e0000000" ... /> 透明<Button android:background=&qu ...
- Luogu 1063 能量项链(动态规划)
Luogu 1063 能量项链(动态规划) Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某 ...
- mysql 对应 binlog 查看
什么是 binlog binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格 ...
- P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化
多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...
- Java7的新特性
原文出处:xixicat 序 本文主要讲Java7的新特性,相对于Java6而言,Java7增加了一些重要的特性,比如NIO2,不像Java6那么鸡肋,也算是一个重要的版本. 特性列表 suppres ...
- centos7 install python3.7 with problem and how to fix it.
问题如下: configure: error: no acceptable C compiler found in $PATH 缺少gcc zipimport.ZipImportError: can’ ...
- jdk1.8.0_45源码解读——LinkedList的实现
jdk1.8.0_45源码解读——LinkedList的实现 一.LinkedList概述 LinkedList是List和Deque接口的双向链表的实现.实现了所有可选列表操作,并允许包括null值 ...