Qt程序能在开发机上顺利跑起来,并不代表把它复制到别的电脑上也一样能打开。要想把一个写好的Qt应用交到普通用户手里,就得为它打好一个安装包,并且在打包的过程中,把那些程序跑起来必须要用到的库和插件,一样不落地全带进去。下面就从生成安装包的基本流程、补齐依赖的常见漏项,以及出了问题怎么排查这三个方向,把整个过程梳理一遍。
一、Qt怎么生成安装包
准备制作安装包的时候,先要确认手头的程序已经用Release模式编译过。如果现在还挂着Debug版本,那它就会去依赖那些带着调试信息的Qt库,文件体积大不说,目标电脑上几乎不会有对应的调试环境,一启动就容易报错。
1、先把Release版本编译出来
在Qt Creator左下角,把构建配置切到Release,然后重新构建整个项目。编译完成后,在工程对应的release文件夹里找到生成的exe或应用包,可以先在自己这台电脑上双击启动一次,确认程序本身没有因为少了自己写的配置文件等原因而报错。
2、搜集程序运行需要的Qt依赖
在Windows系统下,打开与当前Qt版本匹配的命令行环境(从开始菜单里找到对应版本,点开带“命令行”字样的那个图标),用cd命令切到exe文件所在的目录,再执行:
windeployqt你的程序名.exe
这个工具会根据可执行文件里记录的信息,自动把程序调用的Qt动态库、平台插件目录(platforms)、图片格式插件目录(imageformats)以及一部分QML相关的文件,都复制到程序所在的文件夹。如果是在macOS下,则改用macdeployqt,它会帮我们把Qt库打包成私有framework放进app包里,并按规则部署各类插件。
3、用打包工具生成安装程序
依赖文件收集齐全之后,就可以用Qt Installer Framework、NSIS或Inno Setup这类工具,把程序连同刚才搜集到的库和插件一起做成一个安装包。不论挑哪一种工具,通常都要把主程序、依赖目录、配置文件、图标、卸载程序和快捷方式都规划进去,确保用户在安装之后能在开始菜单或桌面上找到程序入口。
4、找一台干净的电脑做安装测试
安装包出来以后,一定不能再只靠开发机上的验证结果。需要另外找一台没装过Qt、也没配置过任何开发环境的普通电脑,从头安装一遍,然后挨个打开最关键的几个界面,确认不会弹出缺少某某dll的提示,图片也能正常显示,只有这样的结果才能说明运行时依赖基本上补齐了。
二、Qt安装包依赖文件怎么补齐
依赖缺失的现象往往不是程序完全打不开,就是窗口里一片空白,或者数据库怎么连都连不上。下面这几类文件,是打包时最容易忘掉的。
1、把平台插件补全
Windows下最常见的问题就是少了platforms文件夹里的qwindows.dll,这个文件是Qt跟Windows图形系统打交道的平台插件。程序启动时只要找不到它,就会直接提示“Failed to create platform plugin”,然后闪退。用windeployqt一般会自动带上这个目录,但手工整理文件时一定要优先检查。
2、不要把图像和数据库插件落下
如果程序需要显示jpg、svg、gif等格式的图片,或者连接了SQLite、MySQL这类数据库,那就得额外关注imageformats和sqldrivers这两个文件夹。图片不显示、数据库连接报错,很多时候并不是代码有问题,只不过是这两个插件目录没有跟着一起打包。
3、检查QML模块是否带齐
界面要是用Qt Quick来写的,仅仅带上exe和基础Qt库是撑不起来的,很多QML控件、Quick模块、样式和布局插件都需要一并部署。因此,在跑windeployqt的时候,一定要直接在真正的Release版本程序上执行,让工具根据实际引用来搜集QML依赖,而不是靠猜测。
4、别漏了第三方库和系统运行库
windeployqt主要只负责Qt自家的依赖,如果项目里还用到了OpenSSL、OpenCV、相机驱动SDK、数据库客户端,或者Visual C++运行库,这些就得靠自己来确认了。假如程序启动后还是报缺少某个dll,可以借助Dependency Walker或更现代的Dependencies工具拉一下,看看缺了哪个文件,再手动补进安装目录或打包脚本里。
三、Qt安装包依赖异常怎么排查
安装包都已经做好了,送到目标机器上装完一运行,还是打不开或者闪退的时候,先别急着重新打包,顺着下面的思路一步步查,往往很快就能定位。
1、先抓住报错信息不放
如果错误框里明明白白写着缺少某个具体名字的dll,就把对应的文件找出来,放进程序目录或打包文件列表。如果弹的是“platform plugin”相关的错误,就从platforms文件夹入手。要是提示某个QML模块没找到,就把注意力放在qml目录和相关的导入路径上,看看是不是漏了某个子文件夹。
2、确认有没有把调试库混进去
发布的文件夹里一定不能出现文件名末尾带“d”的库,例如Qt6Cored.dll,这是调试版库,目标电脑没有调试环境,一旦被加载就可能导致启动失败。发布前可以直接搜索一遍带“d”后缀的Qt库,把它们全部清掉。
3、注意目录结构和配置文件的路径
如果程序在运行时要靠相对路径去读配置文件、语言包、皮肤或模型文件,那么安装之后的整个目录层次就不能随意打乱,必须严格按照程序当初期望的样子去释放。比较稳妥的办法,是让打包工具按源码工程里的目录层次去组织文件,而不是自己另造一套。
4、每次发布都保留一份依赖记录
为了方便后面升级Qt版本或者切换编译器时能快速对比,可以把这一次发布的Qt版本号、编译器信息、执行windeployqt的具体命令、手动补充了哪些第三方库,以及是在什么样的系统上测试的,都记下来。有这样一份清单,以后无论是排查问题还是交接工作,都会快很多。
总结
要打出一个可靠的Qt安装包,基本的次序是,先用Release模式把程序编译出来,接着用windeployqt或macdeployqt自动搜集Qt运行依赖,再用打包工具把整套文件做成安装程序。在制作过程中,一定要反复确认platforms、imageformats、sqldrivers、qml这几个关键目录已经带上,并且手动补齐项目中用到的第三方库和运行库。最后,必须拿到一台没有Qt环境的机器上完整安装一遍,确保不会缺文件、弹错误,这样才能真正交付给用户使用。