0.本文修改记录
(2019-9-3) 修改了VC环境相关的内容
(2020-3-5) 修改了QML模块相关的内容
(2022-8-31)one-rabbit大佬指出打包命令的参数错误,根据文档可知:qmldir应该为exe对应项目qml文件目录,qmlimport才是模块搜索的qml目录。之前错误的将qmldir设置为了安装目录。
文档:https://doc.qt.io/qt-5/windows-deployment.html
1.打包过程
使用Qt自带的命令行工具执行windeployqt命令(比QtWidgets打包多了qml路径设置):
windeployqt 程序.exe --qmldir "项目qml文件所在目录"
一般情况下该拷贝的库也拷贝过去了,可以双击exe运行验证下是否正常。
如果点击exe并不能正常运行,甚至连个响应都没有。通过重定向qDebug输出到文本,可以看到一堆qml的东西没加载。在网上也没有看到靠谱的教程,只能自己折腾了。写了下qt.conf文件配置库路径,并没效果。后来把qt环境里qml文件夹整个copy过来,总算是运行起来了,或许是qml代码里用到的库打包的时候没有被检测到,导致程序启动时加载失败。(2020-3-5补充)有些模块除了需要qml文件夹下的dll,还依赖了bin文件夹下对应的dll,可能需要手动拷贝过来(如QChart,Location,Position之类的),当然懒得找也可以把Qt环境里bin文件夹下release版的dll全copy过来。
注意打包命令出来的Qt5Core.dll和bin目录下那个有点不一样,bin目录下那个带环境绝对路径,自己手动copy的话需要注意下。
2.整理下打包目录
由于文件夹和dll太多了,接下来把目录整理下。先把qml文件夹下的带d的debug动态库删了(如果是直接全部copy过来的话),然后把windeploy打包过来的那些原qml目录下的大写Q开头的文件夹删了,原plugins文件夹下的新建个plugins文件夹放置,默认qml和plugins是平级的,所以不用写qt.conf文件指定。(暂时还没找到方法把这些原bin目录下的dll怎么整理到一个文件夹下)
对于qt.conf,参照 https://doc.qt.io/qt-5/qt-conf.html
不过最后应该是要做成安装包的(使用setup factory、inno setup、qt install framework等工具),所以也不用精简这个文件夹目录。
3.VC运行环境
MSVC编译器打包发布的程序可能会遇到提示找不到 vcruntime140.dll(不同MSVC版本对应不同数字编号)。可以通过Dependencies来查找依赖库(链接 https://github.com/lucasg/Dependencies/releases 解压后运行DependenciesGui,对于360可能会报毒),然后将找到的dll放到exe目录里。
也可能会提示丢失MSVCP140.dll,可以用everything搜该dll,然后放到exe目录里(我一般喜欢copy MSVC安装目录下的)。还可以把MSVC目录下的vcredist_x86/x64.exe拿过去安装下,用everything搜这个程序,然后copy出来在客户机安装就行了。)