在《构建 Qt 安装程序》一节中,我们介绍了很多主流的打包工具,无论最终选择哪一个,都需要先做好充足的准备,例如:集成程序的依赖库、组织安装包的目录结构等。
当所有这些工作准备就绪,最后才是真正的打包发布环节!
1 编译模式选择
通常情况下,程序的编译方式有两种 - Debug 和 Release,其区别在于:
- Debug(即:调试版):包含了调试信息,并且不作任何优化,便于程序员调试程序。
- Release(即:发布版):往往进行了各种优化,使程序在大小和运行速度上都是最优的,以便用户很好地使用。
如果最终要发布程序,切记要将编译模式设置为 Release,
然后再进行构建:
2 集成程序的依赖库
一旦应用程序构建完毕,接下来就是要查找其所依赖的动态库(dll)。由于程序依赖的动态库有时会比较多,因此不建议自己一个个查找(效率太低)。
在这里,推荐一些比较好的工具:
- windeployqt:由 Qt 官方提供,旨在自动化创建可部署文件夹的过程,该文件夹包含了应用程序所需的 Qt 相关依赖项(库、插件和翻译等)。
- Dependency Walker:用于查找程序所需的依赖库,类似的工具还有 Process Explore。
当然,工具不是万能的,有时还要依靠自己的经验!
添加 Qt 相关依赖项
1. 在构建目录下,找到可执行文件 - MyApp.exe,并将其复制到一个单独的文件夹内:
2. 打开 Qt 自带的命令行工具(或者 CMD、PowerShell),并进入上述创建的文件夹中,执行命令 windeployqt MyApp.exe
:
当命令执行完成以后,Qt 的相关 dll、插件、qm 文件都被自动复制进来了,这时基本的依赖关系就算解决了。
注意:如果提示找不到 windeployqt,需要将其所在路径(QTDIR/bin)添加到环境变量 PATH 中。
添加编译器特定的库
虽然 windeployqt 使用很方便,但有一定的局限性,根据 Qt for Windows - Deployment(参考:https://doc.qt.io/qt-5/windows-deployment.html)所述:
The application may require additional 3rd-party libraries (for example, database libraries), which are not taken into account by windeployqt.
可以看出,windeployqt 并没有考虑程序依赖的第三方库(例如:
OpenCV)。
此外,如果使用了 MSVC 编译器,它也不会将相应的 C/C++ 运行时库拷贝进去。这时,像 Dependency Walker(或者 Process Explore )这样的工具就十分有用了,它会检查程序所链接的库文件。
对于特定的编译器,其依赖的库文件如下:
VC++ 14.0 (2015) | MinGW |
|
|
注意:对于 MSVC 来说,相关库位于 Microsoft Visual Studio 2015/VC/redist,分别对应的 x86、x64 等路径下的 Microsoft.VC140.CRT 中。
添加第三方库
依赖性分析结果如下,一般来说,左侧目录树展开三级就足够了:
需要注意的是,黄色问号图标表示的是程序(或者库)所依赖的库,但是找不到该库文件。
由图可知,程序依赖的库有 opencv_world411.dll,依次查找缺失的(非系统)库,然后将他们复制到程序所在目录下。
3 组织安装包的目录结构
在完成以上步骤之后,目录结构如下所示:
倘若不需要提供其他附加文件,这就是我们的最终目录了。
但如果要包含一些像用户手册、配置文件、License 这样的文件,请确保将他们放入对应的目录下,例如:
4 测试程序
当一切准备就绪,接下来要做的就是:测试包的完整性。
当然,先要在自己的电脑上测试通过。然后再将程序拷贝到没有 Qt 环境的电脑中,测试程序能否能正常运行,插件提供的所有功能都存在。
PS:如果能用一台全新的电脑来测试,那是最好不过了。