在前面一篇文章中我们讲了怎么在CMake里设置Qt库的路径、模块添加,最后还给了完整的CMake例子。如果不出意外的话,你的CMake + Qt工程应该能够编译成功了。但如果环境中找不到依赖库,现在还跑不起来。这里就涉及到部署操作。
这其实是个老生常谈的问题。Qt Widgets程序就很麻烦,而Qt Quick程序似乎更麻烦。我在StackOverFlow上就回答过类似问题:[What must be installed on client machine to run a QT Quick Application?]
手动拷贝依赖库的问题
我们平时开发的时候,可以将Qt库路径添加到系统Path环境变量里,从而让基于Qt的程序能够自动加载运行库。单这个做法有以下问题:
- 不能用于正式发布。不能要求普通用户安装Qt开发环境然后在设置Path;
- 不能有效区分多个Qt版本。如果电脑上装了多个Qt版本,那反复设置Path是很麻烦的事情。
所以更好的做法是将对应的Qt依赖都提取出来,放在我们的可执行程序目录内,然后一起打包发布。LGPL协议下使用Qt的话会涉及到大量动态链接库,如果是Qt Quick程序,那么还需要带上很多自带的QML/Quick模块。一种简单粗暴的方法是先将所有可能用到的库都拷贝过去,然后逐个尝试删除,直到剩下必须的。但很明显这种方法非常麻烦,而且Qt的依赖库的目录结构是有讲究的,这个很多人常常弄错。
有人说可以用Depends等工具查看依赖,然后一个个拷贝,但这种方法只能找到C++的类库,Qt Quick相关的模块是查不到的,因为这些类库本质是通过Qt Plugin机制加载的,不是严格的运行时依赖。所以这种方法只能针对Qt Widgets程序,而且也非常麻烦。
更好的方法是利用Qt自带的deployqt程序。
用deployqt程序自动部署
这个程序在bin目录中,各个平台上具体的名字不同,例如在Windows上是windeployqt.exe,在MacOS上是macdeployqt。它是一个命令行程序,能够自动分析程序,拷贝必要的依赖库到我们的可执行程序目录内。
在Windows上用CMD运行windeployqt,可以看到它有很多参数。一般的使用方法是:
windeployqt.exe [options] 你的可执行程序.exe
最常用的是两个:
-
--debug
或者--release
,告诉windeployqt你是想部署调试版依赖库还是最终发布版依赖库; -
--qml
后面加上你的QML文件所在路径,windeployqt会自动分析你的QML文件中import
了哪些库,然后会自动拷贝到当前目录中。
例如:
windeployqt.exe --debug --qml . demo.exe
假如你的QML文件和demo.exe放在一起,那么上面的命令运行下来你会看到当前目录里添加了很多文件和文件夹。
遗留问题
deployqt也不是万能的。经测试,如果我们的QML文件中用了第三方或者我们自己的模块,那这些模块仍然需要我们手动拷贝到可执行程序目录中。但这些模块一般不多,所以问题不大。
网友评论