阡陌 发表于 2023-12-19 00:22:47

Qt 之可执行文件单文件化



!(https://file.mculoop.com/images/2022/11/qtbanner_1668587316.jpg)

## 起因

有时候发布用 Qt 写的软件是件令人烦恼的事情,明明发布的只是一个简单功能的小软件,非得再附上一堆超大的动态链接库,实在让人觉得汗颜😅 。如果像 VC 开发的小软件一样,只需发布单个文件就好了😉

在可执行文件单文件化方面,有多种方法。常用的是,编译并使用静态 Qt 库、使用 exe 打包工具等。exe 打包工具有很多,本文介绍使用 Enigma Virtual Box 来打包和压缩文件。

<!--more-->



## 从收集动态链接库开始

通常是通过查找软件对动态链接库的依赖来收集的,有多种流行的工具软件可供使用:Process Explorer(微软自家的东东)、Dependency Walker 都是不错的软件。但本文介绍的是 Qt 自带的小工具:windeployqt.exe

windeployqt 是一个用于 Windows 系统上的控制台程序,方便起见,可以写一个批处理文件(*.bat)放在 exe 所在的文件夹:

```
@echo off
C:\Qt\Qt5.5.0\5.5\mingw492_32\bin\windeployqt.exe target.exe (换成你的exe文件名)
pause
```

!(https://file.mculoop.com/images/2022/11/2015-12-06_033221_1668587728.jpg)

执行批处理后可以看到文件夹加入了不少动态链接库:

!(https://file.mculoop.com/images/2022/11/2015-12-06_033423_1668587733.jpg)

注意,可能会缺少三个动态链接库 libgcc_s_dw2-1.dll、libstdc++-6.dll、libwinpthread-1.dll,需要手工把他们复制过来。如果不需要国际化,可以把 translations 文件夹删除,以减小一部分空间的占用。还有几个动态库在程序加载的时候没有调用过,似乎也可以删除。



## Enigma Virtual Box 简介

Enigma Virtual Box 是一款免费软件,可以将软件的关联文件和注册表信息合并到单个文件,通过在 RAM 中的虚拟化来使用(不需要向磁盘释放打包了的文件)。它的工作原理是在主可执行程序文件中嵌入一个先于主程序执行的加载器,加载器截获程序对磁盘的读写操作,如果目标文件已被虚拟化(打包),那么就在内存中模拟这个文件并返回请求的结果。它还支持压缩功能,可以大大地减小单 exe 文件的大小。



## 生成单可执行文件

!(https://file.mculoop.com/images/2022/11/2015-12-06_034225_1668587738.jpg)

在 Files 选项卡的 Virtual Box Files 上右键并点击 Add Folder Recursive ,选择软件所在文件夹。

!(https://file.mculoop.com/images/2022/11/2015-12-06_034301_1668587742.jpg)

文件夹内的所有文件都被加入列表,再从中删除主 exe 文件和其他未被用到的文件。

!(https://file.mculoop.com/images/2022/11/2015-12-06_034357_1668587746.jpg)

点击 Files Options ,勾选 Enable Files Virtualization 与 Compress Files。

!(https://file.mculoop.com/images/2022/11/2015-12-06_035143_1668587751.jpg)

最后点击 Process ,执行打包和压缩作业就完成了单 exe 文件的制作,是不是很简单呢?经压缩后,生成的 exe 文件只有8M多了。虽然比起 VC 生成的单文件来说已属大胖子了,胖点又有什么呢😌

!(https://file.mculoop.com/images/2022/11/2015-12-06_035900_1668587754.jpg)

这下子可以愉快地发布给小伙伴们使用了😁

!(https://file.mculoop.com/images/2022/11/2015-12-07_001042_1668587758.jpg)



## 相关链接

Enigma Virtual Box 介绍与下载: <http://enigmaprotector.com/en/aboutvb.html>


页: [1]
查看完整版本: Qt 之可执行文件单文件化