如何将包含第三方库的Windows下QT项目打包成exe文件?
摘要:打包我的 QtC++ 视觉应用:从依赖部署到单文件 EXE 的踩坑之旅 一、前言 最近完成了一个基于 QtC++ 的桌面视觉应用项目(proj_ai_vision_
打包我的 Qt/C++ 视觉应用:从依赖部署到单文件 EXE 的踩坑之旅
一、前言
最近完成了一个基于 Qt/C++ 的桌面视觉应用项目(proj_ai_vision_app)。这个项目功能还挺复杂,不仅用了 Qt 做界面,还集成了 OpenCV 进行图像处理,并且通过我们自研的 AIEngine 库(它内部又调用了 MNN 推理框架)来实现 AI 功能。开发完成后,接下来的重要一步就是将它打包,以便在没有安装开发环境的其他 Windows 电脑上也能顺利运行。
通常,Windows 应用打包有两种主流方式:
部署依赖:创建一个包含 EXE 文件和所有必需的 DLL、资源文件的文件夹。用户直接运行这个文件夹里的 EXE。
单文件打包:将 EXE 和所有依赖项“塞”进一个单独的可执行文件中。用户只需双击这一个文件即可运行。
这篇文章就记录一下我为 proj_ai_vision_app 这个项目打包的过程,特别是后面尝试创建单个可执行文件时遇到的一些坑以及最终的解决方案。
二、打包 EXE 文件流程(带依赖文件夹)
这是最基础也是最标准的打包方式,主要依赖 Qt 官方提供的 windeployqt 工具。
1. 构建 Release 版本
首先,在 Qt Creator 中,确保你的项目配置是 "Release" 模式。Release 构建会进行代码优化,生成的可执行文件运行效率更高,体积也可能更小。点击构建按钮,生成 proj_ai_vision_app.exe 文件。
2. 创建部署目录
新建一个干净的文件夹,专门用来存放打包后的所有文件。我这里创建了一个名为 exe 的目录 (D:\DeskTop\QT_Program\exe\)。然后,将 Qt Creator 构建生成的 proj_ai_vision_app.exe 文件复制到这个 exe 目录中。
3. 使用 windeployqt 收集 Qt 依赖
windeployqt.exe 是 Qt SDK 自带的一个命令行工具,它的作用是分析你的 EXE 文件,然后自动将运行该 EXE 所需的 Qt 库 DLL、必要的插件(如平台插件 qwindows.dll、图片格式插件 qjpeg.dll 等)、翻译文件(.qm)等复制到 EXE 所在的目录。
搜索windows下的qt终端,记得打开的是带有你编译器环境的终端(我这里使用的是MVSC,所以打开的也是带有MVSC环境的QT终端),切换到你的部署目录 (exe 目录),
然后执行:
# 确保 windeployqt 在你的系统 PATH 中,或者使用 Qt 安装目录下的完整路径
windeployqt .\proj_ai_vision_app.exe
执行后,你会看到类似这样的输出,提示它添加了哪些模块和插件:
D:\DeskTop\QT_Program\exe\proj_ai_vision_app.exe 64 bit, release executable
Adding in plugin type platforms for module: Qt6Gui
... (省略其他插件和依赖)
Updating Qt6Core.dll.
Updating Qt6Gui.dll.
Updating Qt6Widgets.dll.
...
Creating directory D:/DeskTop/QT_Program/exe/platforms.
Updating qwindows.dll.
...
Creating D:\DeskTop\QT_Program\exe\translations...
Creating qt_zh_CN.qm...
...
现在查看 exe 目录,你会发现多了很多 Qt6*.dll 文件,以及 platforms, imageformats, styles, translations 等子文件夹,里面也包含了相应的 .dll 或 .qm 文件。
4. 手动添加非 Qt 依赖
windeployqt 只负责 Qt 自身的依赖。我的项目还依赖了 OpenCV、MNN 和我自己编译的 AIEngine。这些库的 DLL 文件需要我们手动复制到 exe 目录中。
