![]() 在《构建 Qt 安装程序》一节中,我们介绍了很多主流的打包工具,无论最终选择哪一个,都需要先做好充足的准备,例如:集成程序的依赖库、组织安装包的目录结构等。 当所有这些工作准备就绪,最后才是真正的打包发布环节! 1 编译模式选择 通常情况下,程序的编译方式有两种 - Debug 和 Release,其区别在于:
如果最终要发布程序,切记要将编译模式设置为 Release, 然后再进行构建:![]() 2 集成程序的依赖库 一旦应用程序构建完毕,接下来就是要查找其所依赖的动态库(dll)。 由于程序依赖的动态库有时会比较多,因此不建议自己一个个查找(效率太低)。 在这里,推荐一些比较好的工具:
当然,工具不是万能的,有时还要依靠自己的经验! 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 )这样的工具就十分有用了,它会检查程序所链接的库文件。对于特定的编译器,其依赖的库文件如下:
注意:对于 MSVC 来说,相关库位于 Microsoft Visual Studio 2015/VC/redist,分别对应的 x86、x64 等路径下的 Microsoft.VC140.CRT 中。 依赖性分析结果如下,一般来说,左侧目录树展开三级就足够了: ![]() 需要注意的是, 黄色问号图标表示的是程序(或者库)所依赖的库,但是找不到该库文件。 由图可知,程序依赖的库有 opencv_world411.dll,依次查找缺失的(非系统)库,然后将他们复制到程序所在目录下。 3 组织安装包的目录结构 在完成以上步骤之后,目录结构如下所示: ![]() 倘若不需要提供其他附加文件,这就是我们的最终目录了。 但如果要包含一些像用户手册、配置文件、License 这样的文件,请确保将他们放入对应的目录下,例如: ![]() 4 测试程序 当一切准备就绪,接下来要做的就是: 测试包的完整性。 当然,先要在自己的电脑上测试通过。然后再将程序拷贝到没有 Qt 环境的电脑中,测试程序能否能正常运行,插件提供的所有功能都存在。 PS:如果能用一台全新的电脑来测试,那是最好不过了。 ·END· 高效程序员 谈天 · 说地 · 侃代码 · 开车 ![]() 长按识别二维码,解锁更多精彩内容 ---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:高效程序员,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ---------------------------------------------------------------------------------------------------------------------- |