前言:将应用程序提供给用户在其他计算机上使用就是发布。即使其他电脑没有安装qt和vs也能成功运行。发布其实就是打包应用程序所需环境的过程。
我的vs版本是vs2019,使用的编译器是msvc2017_64。
目录
1.5.3由f于我的应用程序用到了数据库,debug模式和release模式下,都可以正常运行并使用,但是使用windeployqt发布之后,数据库无法正常链接,不能使用。
1.5.4补充一个软件Dependency Walker,可以查看所需依赖库
1.发布程序步骤
1.1前期准备工作
使用vs的release版本,编译运行,生成.exe。
在编译运行成功后,进入工程目录的release文件夹,找到.exe可执行程序。
复制.exe到一个新建的空文件夹中做发布准备,可重命名,但是点击这个还不能运行,因为没有qt和vs环境。
后文将这个目录称为发布目录。
1.2qt环境的打包
在打包之前先介绍一个工具windeployqt.exe
是qt自带的windows平台发布工具,它可以自动的为一个应用程序复制其运行所需要的各种运行库文件,插件以及翻译文件。生成可发布的目录。这样在其他电脑上,哪怕没有装qt和vs,点击.exe也能成功运行。
注意:应用程序使用那个版本的编译器生成的,就应该用哪个版本的windeplyqt。
我的编译器是D:\app\QT\5.14.2\msvc2017_64这个版本。
打开这个编译器,可以在搜索里直接搜索。
打开这个软件,cd 到发布目录。
输入命令windeployqt 应用程序.exe
以我的为例就是
windeployqt bms.exe
具体操作如下,然后等待其自动打包。
打包完成后,打开发布目录,会看到已经将所需要的动态库,翻译文件,插件等,都已经打包好了。
这时,点击.exe可执行程序,可能会显示丢失某个.dll库,如图所示。因为这个库是我引入的第三方库,windeployqt没有识别上。
解决方式是打开everything软件,这个软件可以自行下载,csdn上有很多,搜索这个库,复制到发布目录中,如果没有显示丢失则跳过这一步。
qt环境打包完毕。
补充一句,进行完上面的步骤,在其他电脑上运行一下,如果可以运行就不需要进行接下来1.3的步骤了。
如果遇到其他问题看一下1.5遇到的问题说不定会有相同的坑。
通常情况下,使用 Qt 的
windeployqt
工具来打包 Qt 程序所需的运行时环境时,是不需要专门打包 Visual Studio 的运行时环境的。这是因为 Visual Studio 的运行时依赖通常是通过操作系统来提供支持的,并且大部分 Windows 系统都会默认安装或提供所需的 Visual Studio 运行时组件。(我在同事电脑上试过了,使用windeployqt打包完之后直接可以运行。)
Qt 程序依赖的主要是 Qt 库和相关的动态链接库,这些由
windeployqt
工具可以很好地处理。它会自动查找并复制所需的 Qt DLL 文件和其他依赖项到您的发布目录中,所以一般进行到这步可以运行就不需要进行vs运行库的打包了。注意:如果你的 Qt 程序依赖于某些特定于 Visual Studio 的组件或库(如某些第三方库是使用 Visual Studio 编译的),那么需要确保这些依赖项在目标机器上可用。这种情况下,需要根据实际情况考虑是否需要打包和分发相关的 Visual Studio 运行时组件。如果需要按照1.3的步骤进行vs环境打包。
1.3vs环境的打包
vs环境的打包有两种方式,一种是拷贝其依赖的所有运行库,一种是将vs环境打包成应用程序发布。这里介绍第一种方式。第二种方式在1.5.3vs运行库问题中有介绍。
首先先打开vs开发人员命令提示符。
cd 进入到vs工程目录下的release文件夹。我的路径为
D:\VSProject\00_multiHTEM_BMU_1\YF_HTEM_BMU_Multi\x64\Release
获取所有vs与本程序相关的依赖库dll文件,使用命令dumpbin /IMPORTS name.exe>output.txt。需要将name.exe,换成自己的应用程序。
dumpbin /IMPORTS name.exe>output.txt
//dumpbin 是一个分析可执行文件的工具,它可以提供文件的详细信息,包括导入表,导出表,节表等
// /IMPORTS 是命令参数之一,表示只显示导入表信息
// >重定义符号,将导入表信息打印到output.txt中,而不是打印到控制台
//dumpbin的其他用法
//dumpbin还有另一种查看依赖库的命令
//dumpbin /dependent YF_HTEM_BMU_Multi.exe 不重定向这样会直接输出在控制台
//dumpbin /headers YF_HTEM_BMU_Multi.exe 可以查看应用程序的位数
具体操作如下
在release文件夹下找到ouput.txt打开。你会发现除了qt所需要的dll,之外还有很多vs的dll库没有链接上。在everything中找到这些库,跟上述的步骤一样,复制添加到要发布目录中。
至此,vs所需环境打包完毕。
1.4测试
为测试所有的环境已经全部打包完毕。
需要将系统环境变量中的bin目录删除。删除之后,双击运行.exe,可能会出现确实哪个库,还是以上的步骤,添加即可。
如果不删除系统环境变量,系统总是能从环境变量中qt的bin目录找到所需要的依赖库,就起不到测试的目的。即使在开发程序的电脑上测试没有问题,最保险的方式还是应该将文件放在在一台没有安装qt的电脑上运行测试。
、
1.5遇到的问题
1.5.1 0xc000007b错误
在1.2qt环境的打包中,使用everything查找所需库ControlCan.dll,添加到发布目录。
出现0xc000007b错误。这个错误极有可能出现。出现这个错误的原因是我们在everything中拷贝的库是32位的,而我们的应用程序是64位的,32和64位版本不能混用。
例如使用everything搜索这个库时,可能直接复制的第一个,但是第一个版本是32位的。
关于系统文件夹,在windows系统中,
-
C:\Windows\System32
:这是一个指向 Windows 系统文件夹的路径。在 64 位 Windows 系统中,它是存放 64 位系统文件的目录。因此,它是一个 64 位路径。 -
C:\Windows\SysWOW64
:这是一个指向 Windows 系统文件夹的路径。在 64 位 Windows 系统中,它是存放 32 位系统文件的目录,其中的“WOW64”是指“Windows-on-Windows 64”。因此,它是一个 32 位路径。
在 64 位 Windows 系统中,为了兼容旧的 32 位应用程序,系统会在 SysWOW64
文件夹中保存 32 位系统文件,同时保留 System32
文件夹用于存放 64 位系统文件。
所以复制正确的ContorlCan.dll版本放入发布目录。
1.5.2发布时,默认文件不会覆盖
使用windeployqt,再次发布时,发布目录中的文件不会覆盖,加上--force参数
windeployqt --force .exe
1.5.3vs运行库问题
除了最开始上面说的vs环境打包的方式,将所需要的库复制进去,还有一种VS运行库安装程序。刚打开qt编译器命令行时有这样一行语句
使用windeployqt打包输出的过程语句中,有这样一句提示
意思是说,没有运行vcvarsall.bat,所以VS的环境变量没办法成功配置,所以不会拷贝VS相关的依赖库。
vcvarsall.bat是VS的自带的配置环境变量的批处理文件。
我的vs版本是vs2019,这个文件的位置在下面,vs2017以及以后的版本vcvarsall.bat位置都在这里
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build
打开qtmsvc_2017命令行窗口,调用这个批处理文件
将对应版本的批处理文件拖入。我的是64位的。我们就可以看到环境已经配置成功。
还有另一种方式就是,将vcvarsall.bat拖入,并在后面加上相应的版本,然后可以看到环境配置成功。
这个时候再cd到发布目录,重新发布,就会看到warning消失,
并且发布目录里会出现一个应用程序vc_redist.x64.exe.
至此vs的环境都已经打包在这个应用程序中,用户在自己的电脑上运行这个咱们的程序时,首先需要点击vc_redist.x64.exe,安装后会自动配置好vs环境,之后程序才能运行。这个和之前逐个拷贝动态库的就是多了一个安装vs运行库的步骤。
1.5.3由f于我的应用程序用到了数据库,debug模式和release模式下,都可以正常运行并使用,但是使用windeployqt发布之后,数据库无法正常链接,不能使用。
正常来讲,如果用到了数据库,需要将运行该应用程序所需要的驱动,放入plugins文件夹下。这样做可以确保应用程序在运行时能够正确加载并使用数据库驱动程序。
我的问题出在,使用windeployqt发布的应用程序,生成的插件目录为sqldrivers。而我需要的是plugins,所以新建一个plugins文件夹,将sqldrivers文件夹复制到plugins下。问题解决,数据库成功链接。
除此之外还有libmsyql.dll,以及libcrypto-3-x64.dll
和 libssl-3-x64.dll都需要拷贝到发布目录下。
上述依赖库都在此文件夹下
C:\Program Files\MySQL\MySQL Server 8.0\bin
1.5.4补充一个软件Dependency Walker,可以查看所需依赖库
这个软件使用方式很简单,将.exe拖入,等待片刻,就会分析出所有的依赖关系。在everything中查找放入发布目录。但是尽量还是按照qt以及vs的环境打包过程,一步一步进行,如果之前的操作下来都不行,可以打开这个软件查看需要哪个依赖库。
如果是缺失库,会看到前面会有黄色疑问号。
如果是位数不对,位数会显示红色。
并且如果缺失某个库运行程序,应该会提示你缺失哪个库。但是位数不对,会提示0xc000007b的错误。
1.5.5补充dumpbin的另一种查看依赖库的命令
dumpbin /dependent YF_HTEM_BMU_Multi.exe
1.5.5总结
完整发布程序的步骤,一路遇到的问题都记录下来了,之前掌握的知识只停留在表面,所有的坑只有自己踩过才会印象深刻。路漫漫其修远兮,吾将上下而求索。学习之路还很漫长,之后遇到的话还会补充记录。