QT从入门到入土(八)——项目打包和发布
引言
新手上路可谓是困难重重,你永远不知道下一个困难会在什么时候出现,在完成了运动控制卡封装发布过程中可谓是举步维艰。因此记录一下qt5+vs2019的打包发布方法。
打包一般分为两步:
- 将编译后的exe可执行文件及其各种依赖dll、lib、图标、配置文件等先打包放到一个目录中
利用VS的插件Microsoft Visual Studio Installer Projects安装程序打包插件进行打包
一,将编译后的exe可执行文件及其各种依赖dll、lib、图标、配置文件等先打包放到一个目录中
(1)dumpbin指令查看可执行文件的dll依赖包
在VS开发人员命令提示符(vs界面->工具->命令行->开发者命令提示)中执行dumpbin /dependents 程序路径 :dumpbin/dependents C:\Users\WFD\Desktop\GCtest\Debug\GCtest

(2)windeployqt.exe指令自动将qt依赖包复制过来
1️⃣先打开 Qt 的命令行(用的32位)

2️⃣使用“cd/d 路径” 命令进入到包含.exe 文件的文件夹。
3️⃣ Qt 命令行执行 windeployqt 工具,输入: “windeployqt ***.exe” ,就可以将qt依赖包复制到该文件夹中


(3)非Qt依赖库的添加
要注意release版本与debug版本所需要的依赖是不一样的,需要分别打包!!!
- 方法一
在通过vs的dumpbin指令查询到可执行文件的dll依赖包后,使用eyerything软件根据位置去寻找dll文件。
下载地址:http://www.voidtools.com/

- 方法二
如果动态库有很多那么复制起来很麻烦(比如上面Qtcore.dll查找到很多路径,但是不知道用哪个),可以使用window的批处理:
通过观察程序运行时Vs输出窗口中加载的dll库:

- 方法三
使用Dependency Wallker 打开***.exe 查找不存在的.dll,其中黄色的问号标识是不存在的。Dependency Wallker可以递归显示可执行文件(exe)和动态库(dll)调用的动态库。
打开**.exe文件之后各个节点可能是展开的很乱,可以右击任意节点选择“折叠所有(L)”,然后再单击根节点的加号展开就是如图所示的样式,这样很清晰。
在全部添加完依赖库后,点击exe运行文件就可以本机运行了。下一步就是打包发布(即可以在未装vs和qt机器上运行)
二,利用VS的插件Microsoft Visual Studio Installer Projects安装程序打包插件进行打包
安装过程不再详述参见:Installer Projects插件的安装
(1)新建安装项目
解决方案->新建项目->setup project

进入文件系统:(setup1->view->文件系统)

(2)添加文件
Application Folder->add->文件(在此添加相关的依赖资源)

将exe所在目录下的所有文件添加到该处
(3)添加项目输出
Application Folder->add->项目输出(主程序入口)

对主输出创建快捷方式,并将其拖动到User‘s Desktop内

(4)打包发布
对setup1项目进行重新生成,即生成安装程序

QT从入门到入土(八)——项目打包和发布的更多相关文章
- QT从入门到入土(二)——对象模型(对象树)和窗口坐标体系
摘要 我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活.比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可 ...
- QT从入门到入土(四)——多线程(QtConcurrent::run())
引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...
- QT从入门到入土(三)——信号和槽机制
摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...
- QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置
引言 24岁的某天,承载着周围人的关心,一路南下.天晴心静,听着斑马,不免对未来有些彷徨.但是呢,人生总要走陌生的路,看陌生的风景,所幸可以听着不变的歌,关心自己的人就那么多.就像是对庸常生活的一次越 ...
- QT从入门到入土(三)——文件的读写操作
引言 文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处 理而开发的,所以文件读写是应用程序开发的一个基本功能. Qt 提供了两种读写纯文本文件的基本方法: 用 QFi ...
- QT从入门到入土(四)——多线程
引言 前面几篇已经对C++的线程做了简单的总结,浅谈C++11中的多线程(三) - 唯有自己强大 - 博客园 (cnblogs.com).本篇着重于Qt多线程的总结与实现. 跟C++11中很像的是,Q ...
- QT从入门到入土(九)——TCP/IP网络通信(以及文件传输)
引言 TCP/IP通信(即SOCKET通信)是通过网线将服务器Server端和客户机Client端进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯.控制器可以设置 ...
- vue项目打包后想发布在apache www/vue 目录下
使用的是vue-element-admin做示例,可以参考Vue项目根据不同运行环境打包项目,其他项目应该大同小异. 使用vue-router的browserHistory模式,配置mode: 'hi ...
- sencha touch 入门系列 扩展篇之sencha touch 项目打包压缩
经常有新手同学抱怨说sencha touch的项目加载速度为什么这么慢,经常要10秒左右的时间甚至更多, 大家都知道,sencha touch开发的项目中引用了大量的js文件,当我们打开项目时,st的 ...
随机推荐
- tomcat shutdown后,进程还存在linux系统中的解决办法
基本原理为启动tomcat时记录启动tomcat的进程id(pid),关闭时强制杀死该进程 第一步 :vim修改tomcat下bin/catalina.sh文件,添加点东西,主要是记录tomcat的p ...
- 文末送书四本 | 这篇Java反射机制太经典!不看后悔!
先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员. 价值:Java技能,面试经验指导,简历优化,职场规划指导,技能提升方法,讲不完的职场故事,个人成长经 ...
- ROS笔记一
1.lwip:瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈.实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用. 2.RTOS:实时操作 ...
- 「AGC029C」Lexicographic constraints
「AGC029C」Lexicographic constraints 传送门 好像这个题非常 easy. 首先这个答案显然具有可二分性,所以问题转化为如何判定给定的 \(k\) 是否可行. 如果 \( ...
- python 15篇 面向对象
1.面向对象编程概念 面向对象是包含面向过程 面向过程编程 买车: 1.4s看车,买车 2.上保险 保险公司 3.交税 地税局 4.交管所 上牌面向对象编程 卖车处: 1.4s 2.保险 3.交税 4 ...
- python twain 扫描
def multiScan(self): """ Scan and return an array of PIL objects If no images, will r ...
- c语言:scanf()高级应用
1) 指定读取长度 还记得在 printf() 中可以指定最小输出宽度吗?就是在格式控制符的中间加上一个数字,例如,%10d表示输出的整数至少占用 10 个字符的位置: 如果整数的宽度不足 10,那么 ...
- PyCharm代码区不能编辑的解决办法
问题: 修改之前的Python代码时发现代码区无法编辑,无意中输入i后又可以编辑了. 解决: 原因是打开了工具中的vim Emulator编辑模式,把vim Emulator前面的勾取消即可.
- Java基础00-集合基础15
1. 集合基础 1.1 集合概述 1.2 ArrayList构造方法和添加方法 代码示例: 想通过指定索引添加到最后一个位置的话就填写,现有索引的+1,比如3个索引就是4.如果在指定索引的位置添加没有 ...
- Scala学习——模式匹配
scala模式匹配 1.基础match case(类似java里switch case,但功能强大些) object MatchApp { def main(args: Array[String]): ...