作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
简介
说到 Qt 应用程序的发布,首先需要了解程序的编译。Qt 程序的编译分为静态编译(static)和动态编译(shared)。静态编译的特点是只生成一个可执行文件,可直接运行程序,不需要依赖库,内存占用小,但是要完成静态编译的门槛比较高,需要自己下载 Qt 源代码去配置去编译,而且有些 QML 的库是无法静态编译的;而动态编译就是我们最常用的方式,生成一个可执行文件,此文件的运行需要很多 Qt 的库文件和系统的库文件,甚至一些第三方的库,内存占用率比较高,哪怕只是一个 hello world 的程序都会带有几十兆的依赖库。
我们对动态编译的程序进行发布,其实就是找到程序的所有依赖库,把这些库文件和应用程序放在一个目录下,即可实现目的。Qt 提供了一个打包工具,叫做 deployqt,可以将应用程序所依赖的库文件都提取出来,并且支持跨平台。在 Windows 系统叫 windeployqt,在 Linux 系统叫 linuxdeployqt,在 Mac 下叫 macdeployqt。这里以 Windows 系统为例
配置环境变量
首先我们要知道 windeployqt.exe 是在构件套件的 bin 目录下的,所以每一个构件套件的 bin 目录下都会有一个,如图所示: 既然每个套件下都有,那么用哪个就会存在争议。所以最好的办法就是你用了那个编译,就把对应的 bin 目录添加到环境变量,确保打包的时候能够找到正确的依赖库
Widget 程序和 Quick 程序的区别
工具准备好之后就可以开始使用了,具体步骤如下:
- 新建一个空的文件夹,比如 D:\test
- 把编译生成的 exe 文件拷贝到刚才创建的文件夹下
- 打开命令行,输入
cd /d D:\test - 如果是 Widget 程序,输入
windeployqt applicationName.exe 会自动把 Qt 的依赖库拷贝到 test 目录 - 如果是 Quick 程序,需要多添加一个 qmldir,例如
windeployqt applicationName.exe --qmldir D:\Qt\Qt5.12.8\5.12.8\msvc2017_64\qml 会自动把 Qt 的依赖库拷贝到 test 目录 - 再把程序运行需要的第三方库拷贝到 test 目录,就大功告成啦
QML 程序打包完之后无法运行的问题
QML 的程序有时候打包完之后会出现无法运行的情况,界面都无法打开。这是因为使用了一些特定的模块,比如 QtCharts、QtDataVisualization 等等,这里不得不提一下 windeployqt 的坑了,只会把基础的依赖库自动拷贝出来,一些从商业版免费开放出来的库就不会自动拷贝,呵呵!
这里介绍一个好的方法,就是在 pro 文件中添加一行代码 CONFIG += console 效果就是让程序的日志在命令行输出,这样如果缺少了依赖库,就能看到提示了,然后再根据提示去 Qt 的目录下找到对应的库文件拷贝到 test 目录即可
脚本分享
这是博主自己写的脚本,太懒了不想每次复制打命令
@echo off
md %USERPROFILE%\Desktop\test
copy .\build-ShineOptics_Interferometer-Desktop_Qt_5_12_8_MSVC2017_64bit-Release\Sirius-Pro.exe %USERPROFILE%\Desktop\test\
xcopy .\64_release\ %USERPROFILE%\Desktop\test\ /s /e /c /y /h /r
cd /d %USERPROFILE%\Desktop\test
windeployqt Sirius-Pro.exe --qmldir D:\Qt\Qt5.12.8\5.12.8\msvc2017_64\qml
步骤解析如下:
- 在用户桌面创建文件夹 test
- 把编译目录下生成的 exe 文件拷贝到 test 目录
- 把程序的所有第三方依赖库全部拷贝到 test 目录
- 切换到 test 目录下
- 使用 windeployqt 自动复制 Qt 的依赖库到 test目录,到此大功告成!
|