windeployqt.exe是qt自带的工具,用于创建应用程序发布包。简单来讲,这个工具可以自动的将某程序依赖的库、资源拷贝到其所在目录,防止程序在其他电脑上运行报找不到库的错误。
windeployqt.exe工作原理很简单,它会到当前的环境变量PATH配置的搜索路径中,查找应用程序所需要的库和资源,拷贝到应用程序目录中。
先从开始菜单中打开对应版本的Qt命令行终端界面,如下图:
在命令行中输入:
windeployqt.exe 应用程序完整路径
回车即可执行发布命令。注意,我们通常会将release的可执行性文件拷贝到另外一个目录中,然后将该目录作为发布目录。
进入发布目录可以看到,目录中增加了很多依赖库和数据文件。大体上的流程只有这两步。整个发布过程看似比较简单,但是其中还是存在一些坑的。
关于这一点,我是看其他网友这么写的,但是还是心存疑虑的,感觉不会出问题。
首先,我们可以看看,启动Qt命令行终端的时候,其他它的操作就是两个:
第一个关于环境变量的我们先不说。直接看第二点就是切换了目录。这个目录在哪呢?
就是我们Qt的安装目录。其版本对应的库和资源都在这个目录下。并且windeployqt.exe就在bin目录下。只有进入windeployqt.exe所在目录下,才可以执行命令:
windeployqt.exe 应用程序完整路径
如果执行的windeployqt.exe版本正确,其找到的库版本应该不会出错。
发布软件时,必须使用项目开发所使用的Qt版本,并使用此版本Qt安装目录下的windeployqt.exe完成发布过程。每个Qt版本中的工具只有在此Qt版本下才能确保正常工作,混用会引入未知的风险。
在Qt命令行终端中多次执行发布命令,已在发布文件夹中的文件默认不会被覆盖。可以通过添加强制覆盖参数–force强制覆盖已存在的文件。建议始终添加–force参数,防止因文件未覆盖而出现问题。
Qt命令行启动时有一行提示:
意思是说,因为我们没有运行vcvarsall.bat,所以VS的环境变量没有配置好,所以不会拷贝VS相关的依赖库。vcvarsall.bat是VS的自带的配置环境变量的批处理文件。那我们就尝试运行vcvarsall.bat来配置一下VS的环境。如果没有找到
C:\Qt\5.15.2\msvc2019_64>"D:\Program Files\VisualStudionIDE\VC\Auxiliary\Build\vcvarsall.bat" x64
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.11.17
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
vcvarsall.bat的目录需要自己在电脑上找到。然后我们再次执行打包命令,会发现发布目录下多了一个可执行文件:
这个可执行性文件中有VS的依赖库,在没有安装VS的电脑上运行即可。
就是为了偷懒。。。该脚本在项目跟目录下执行,具体的也可以根据实际情况调整脚本代码,仅供参考。
deploy_path="./HapticChipTool_Release$(date "+%m%d")"
release_file_path="./build-HapticChipTester-Desktop_Qt_5_15_2_MSVC2019_64bit-Release/release/HapticChipTester.exe"
deploy_file_path="${deploy_path}/HapticChipTool.exe"
#创建部署文件夹
if [ ! -e ${deploy_path} ]
then
mkdir ${deploy_path}
fi
#将release的可执行文件拷贝到部署目录下
cp ${release_file_path} ${deploy_file_path}
deploy_tool_path="C:\Qt\5.15.2\msvc2019_64\bin\windeployqt";
#调用工具进行打包
${deploy_tool_path} --force ${deploy_file_path}