Qt 应用程序发布

作者: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 程序的区别

工具准备好之后就可以开始使用了,具体步骤如下:

  1. 新建一个空的文件夹,比如 D:\test
  2. 把编译生成的 exe 文件拷贝到刚才创建的文件夹下
  3. 打开命令行,输入 cd /d D:\test
  4. 如果是 Widget 程序,输入 windeployqt applicationName.exe会自动把 Qt 的依赖库拷贝到 test 目录
  5. 如果是 Quick 程序,需要多添加一个 qmldir,例如windeployqt applicationName.exe --qmldir D:\Qt\Qt5.12.8\5.12.8\msvc2017_64\qml会自动把 Qt 的依赖库拷贝到 test 目录
  6. 再把程序运行需要的第三方库拷贝到 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

步骤解析如下:

  1. 在用户桌面创建文件夹 test
  2. 把编译目录下生成的 exe 文件拷贝到 test 目录
  3. 把程序的所有第三方依赖库全部拷贝到 test 目录
  4. 切换到 test 目录下
  5. 使用 windeployqt 自动复制 Qt 的依赖库到 test目录,到此大功告成!

猜你喜欢

转载自blog.csdn.net/qq_34139994/article/details/120011647