QT 程序的打包和发布

环境说明

开发机环境:Windows10 X64+VisualStudio2019+QT5.9(配置了QT,C++程序能正常运行的环境配置)

发布机环境:Windows7 X64(未配置任何和QT,C++有关的环境配置)


关于QT编译的可执行文件

在用VisaulStudio+Qt模板写完程序后,在VisaulStudio中的debug或者release状态下运行程序都是没有问题的,并且会在工程目录下生成对应的debug或者release文件夹,里面存放着各自生成的exe(可执行文件),在 一般情况下,我们可以直接双击exe文件运行其程序.

但是,由Qt编写生成的exe可执行文件是无法直接运行运行的,这是因为Qt程序默认情况下是动态编译的,需要dll文件(动态链接库文件)才能正常运行

关于DLL文件:
DLL(Dynamic Link Library)文件为动态链接库文件,又称应用程序拓展,在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中,当我们执行某一个程序时,相应的DLL文件就会被调用,一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件

当我们在IDE中运行使用QT模板编写的可执行程序的时候,Qt会通过QtCreator中的设置自动找到dll位置,所以此时用户可以正常运行程序,如果直接在可执行文件所处项目文件夹中直接运行其exe可执行文件,那么程序会自动去环境变量或者exe可执行文件所处目录下寻找dll文件,为了使用户能正常打开QT项目文件中生成的可执行文件,我们有以下两种解决方案:

方法一:把缺少的dll文件拷贝到和exe可执行文件所在目录下,这种方式不推荐,因为每次都要拷贝大量dll文件,不方便,不进行演示
方法二(推荐): 设置环境变量,在下方进行演示


在开发机中打开未发布的Qt可执行文件

现在有一个Qt编译生成的可执行文件名为:创建一个标准窗口程序.exe,首先我们不进行任何处理,也不进行程序的发布,直接找到此项目文件生成的exe可执行文件并试图将其打开:

在这里插入图片描述
在这里插入图片描述

由上可见,直接对QT工程文件生成的.exe文件进行打开操作,将无法正常打开,此时若我们想在自己的设备(不必进行程序发布)上运行源文件生成的可执行文件,我们需要在设备的Path环境变量中添加Qt存放dll文件的目录路径

本设备存放QT程序运行所需的dll动态链接库文件的路径为: D:\QT\5.9\msvc2017_64\bin,找到这个目录后,我们需要将其添加到系统属性-环境变量-用户变量-Path变量中,即:

在这里插入图片描述
此时便可以打开并运行创建一个标准窗口程序.exe这个可执行文件

在这里插入图片描述
此时我们虽然能在开发设备上打开并运行Qt编译的可执行文件,但如果我们此时想把此程序打包发布给发布机上,则需要进行程序的发布和打包


QT程序发布和打包到发布机上

在Release模式下编译工程并生成exe文件

在这里插入图片描述


检查生成的Realse发布文件夹

在这里插入图片描述


对生成的Realse发布文件夹中生成的文件进行深入解释

moc文件夹

由于Qt 不是使用的“标准的” C++ 语言,而是对其进行了一定程度的“扩展”,这里我们从Qt新增加的关键字就可以看出来:signalsslots 或者 emit。所以有人会觉得 Qt 的程序编译速度慢,这主要是因为在 Qt 将源代码交给标准 C++ 编译器,如 gcc 之前,需要事先将这些扩展的语法去除掉,完成这一操作的就是 moc

moc 全称是Meta-Object Compiler,也就是“元对象编译器”。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc 的执行是在预处理器之前。因为预处理器执行之后,Q_OBJECT 宏就不存在了。

既然每个源文件都需要 moc 去处理,那么我们在什么时候调用了它呢?实际上,如果你使用 qmake 的话,这一步调用会在生成的 makefile 中展现出来。从本质上来说,qmake 不过是一个 makefile 生成器,因此,最终执行还是通过 make 完成的
详见Qt moc文件的作用🔍

qmake文件夹

在开发Qt的过程中,qmake生成的工程文件(pro文件)用于编译应用程序和插件,可以说qmake的主要目的是生成pro文件的makefile,且qmake简化了makefile的生成

其文件夹内有一个后缀为.props VS工程属性文件,其用来说明qmake为这个应用程序创建makefile所需要的细节:例如一个源文件和头文件的列表、任何应用程序特定配置、例如一个必需要连接的额外库、或者一个额外的包含路径,都应该放到项目文件中

详见qmake使用方法(自动生成Makefile文件)🔍

rcc文件夹

Qt为我们提供了一个工具rcc,可以使用该工具对QT程序的qrc资源文件进行二进制编译,也就是加密,编译后会生成新的文件,然后我们在程序中直接对新的文件进行注册,就可以正常使用了.

Qt资源文件加密🔍

uic文件夹

其存放了使用uic工具生成的QT的UI的.h.c文件

.tlog文件夹

这个是VS产生的日志之类文件, T.LoG文件是必要的,以确保适当的增量构建,它们包含数据,这些数据告诉构建系统在构建过程发生时访问哪些文件,这样我们就可以非常可靠地判断这些文件中是否有任何更改

.obj文件

程序编译时生成的中间代码文件,即目标文件,一般是程序编译后的二进制文件,其再通过链接器和资源文件链接就成可执行文件(exe文件)了.obj文件只给出了程序的相对地址,而可执行文件是程序的绝对地址

.log文件

日志文件(logfile)是一个记录了发生在运行中的操作系统或其他软件中的事件的文件,或者记录了在网络聊天软件的用户之间发送的消息,日志记录保存日志的行为, 最简单的做法是将日志写入单个存放日志的文件, 许多操作系统,软件框架和程序都包含日志系统,其主要用于排除故障和操作系统

.exe文件

可执行文件,可移植可执行(PE)文件格式的文件,它可以加载到内存中,并由操作系统加载程序执行,是可在操作系统存储空间中浮动定位的可执行程序,是程序的绝对地址,我们通过可执行文件来调用程序


添加QT依赖库文件到生成的Realse发布文件目录中

QT为了简化生成发布程序版本,特别提供了windeployqt.exe工具,以本开发机为例,这个工具所在目录为在D:\QT\5.9\msvc2017_64\bin\windeployqt.exe
在这里插入图片描述

通过在QT命令行程序中输入该工具的路径和该工具的可执行文件名,后跟待发布程序所处的文件路径和该程序的可执行文件名

在命令行中按下回车执行该命令后我们就可以添加QT程序运行时所需的DLL(动态连接库文件)文件到该QT程序所处的发布文件目录中了

具体步骤:
在这里插入图片描述

本发布机中,添加依赖库的指令如下:D:\QT\5.9\msvc2017_64>windeployqt.exe D:\实验台\QT技术\QT课程内容\创建一个标准窗口程序\x64\Release\创建一个标准窗口程序.exe


检查添加依赖库后的Realse发布文件夹

在这里插入图片描述

注意:上图文件夹中生成的DLL链接库文件和此前未添加依赖项时的Release文件夹中的几个文件夹和日志文件和可执行文件都在程序打包运行的过程中非常重要

只有这些文件共同存在,在发布文件夹打包发布后,发布机上运行程序时,才不会出现因缺少 XXX DLL动态链接库无法运行程序无法启动此程序,因为计算机中丢失qt5widgets.dll的错误!


发布发行文件夹到发布机

此时这个文件夹已经具备了发布可执行文件夹标准,我们此时可以将Release这个发布文件复制到别的路径,将其重命名并进行压缩,再将其发送到发布机中,发布机解压缩我们的发布文件并点击其中的可执行文件后,我们便可以在发布机中运行我们发布的QT程序了

在这里插入图片描述

在发布机中解压接收到的发布文件夹压缩包,并运行其中的可执行文件:
在这里插入图片描述
由上可见,一个QT程序文件夹成功从开发机(WIN10 X64)打包发布到一个完全没有任何QT环境配置的发布机(WIN7 X64)中,并成功运行了程序文件夹中的QT可执行程序

除此之外,我们还可以将这个可在发布机上运行的QT程序的文件夹在开发机中封装成一个exe可执行文件,再将其传输到发布机中,此时开发机中只需接收一个exe可执行文件并将其打开就可以运行我们的QT程序了


封装发行程序文件夹为可执行文件

封装发行程序文件需要使用一个名为Enigma Virtual Box的单文件封包工具,其将发行文件中的可执行文件及其相关DLL依赖项打包成单个可执行文件

选择待封包文件夹的路径:
在这里插入图片描述

拉取待封包文件夹文件到VirtualBoxFiles中并执行封包
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

传输封包后的可执行文件到发布机上并运行可执行文件:

在这里插入图片描述


错误处理

如果发布机上运行QT程序时,程序无法运行且提示 缺少某DLL动态链接库文件 ,我们需要将开发机上正确路径的DLL文件拷贝到发布机的 window\sytem32系统文件夹 包含QT程序的发布文件夹中

本开发机上QT程序运行时所需的DLL动态链接库文件的正确路径为D:\QT\5.9\msvc2017_64\binwindow\sytem32 系统文件夹中,一般情况下我们使用Everything这个检索文件软件进行动态链接库文件的查找

发布机上运行QT程序出现错误:
在这里插入图片描述

在开发机上检索正确的DLL文件并将其拷贝到发布机中:

在这里插入图片描述

在这里插入图片描述

完成以上步骤后再次在发布机上执行QT程序时,将不会出现缺少Qt5Core.dll的错误


扩展

DependencyWaker的使用:

Qt的工具只能找到Qt相关的dll,有时候我们发布出去的话,对方电脑未必装了Opencv或者Vs2019,因此还有些dll需要手动拷贝到刚才的目录下,可以用DependencyWaker来查找当前EXE可执行文件涉及哪些dll,该工具能够看到所有的相关的dll

缺失DLL下载网站🔍
DependencyWaker下载(提取码: 9mqe)🔍
EnigaVirtual box下载(提取码: m4v4)🔍


来自:

拷贝DLL运行库至准备发布的Release文件夹中🔍
QT5.13 打包发布应用(VS2019 或 QT Creator)🔍
VS+QT应用开发-发布RELEASE程序打包发布🔍

Qt程序打包(使用Enigma Virtual Box和BoxedApp Packer封包)🔍

QT发布程序(VS2015+Qt5.12.3)🔍

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值