qt打包发布release应用程序

qt发布release版本时需要打包一些dll,需要哪些呢?请看截图:

用windepolyqt.exe提取应用程序依赖.dll文件

QT Creator release的.exe应用程序的运行需要依赖一些动态链接库,如果在一台没有安装QT的计算机上运行就需要打包动态库拷贝过去才能运行。QT自带有windeployqt.exe可执行程序可以将应用程序所依赖的.dll文件提取出来。

在这里要非常注意的一个坑:QT项目中release用的是哪个编译器,就应该运行哪个bin文件下对应的windeployqt.exe,例如我这里用的是MSVC2015 64bit的编译器,因此就要去QT安装目录下的msvc2016_64下的bin文件夹找windeployqt.exe可执行程序。如果使用的windeployqt.exe不对,打包后运行会提示缺少.dll文件,如缺少VCRUNTIME140_APP.dll(缺少VCRUNTIME140.dll一般是因为电脑没有安装Microsoft Visual C++ 2015 Redistributable(x64/x86)这两个库,如果安装了点击修复,如果还出现缺少.dll文件,像我这里一样,就要看看用的windeployqt.exe对不对了)

qt的安装包下找到这些文件,放在release文件夹下即可,当然有些时候也会需要一些其他的,比如含有串口的程序还需要加入Qt5SerialPort.dll,但这个时候就可以尝试运行一下,会具体提示缺少哪一个文件,找到后再加入就好。

在qt的安装包下会有两个目录包含以上文件,D:\Qt\Qt5.5.1\5.5\mingw492_32\bin以及D:\Qt\Qt5.5.1\Tools\QtCreator\bin,最好使用前者目录下的文件,切记千万不要两个目录下的文件混合使用,会报错无”法定位程序输入点于动态链接库Qt5Core.dll “。

Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,
如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行。
因此 Qt 官方开发环境里自带了一个工具:windeployqt.exe。
以官方 Qt 5.4.0+MinGW 开发环境为例,
从开始菜单–》Qt 5.4.0–》5.4–》MinGW 4.9 (32-bit)–》Qt 5.4 for Desktop (MinGW 4.9 32 bit),可以打开 Qt 命令行,从这里就可以执行 windeployqt 工具。

集成开发环境 QtCreator 目前生成图形界面程序 exe 大致可以分为两类:
Qt Widgets Application 和 Qt Quick Application。

1、Qt Widgets Application可执行程序发布方式
首先用 QtCreator 新建一个 Qt Widgets Application 项目,直接用默认的 QMainWindow 程序就可以了,项目名字假定是 hellomw。
然后以 Release 方式编译生成 exe 程序:

生成的程序运行正常之后,找到项目的生成目录,比如 项目源码路径:
C:\QtPros\hellomw\
它的项目生成目录是
C:\QtPros\build-hellomw-Desktop_Qt_5_4_0_MinGW_32bit-Release\
进入这个文件夹,在进入它的子文件夹 release 里面,找到 hellomw.exe ,
将这个exe 复制到一个新的单独的文件夹里用于发布,比如存到 
D:\hellomw\ 文件夹里面。

然后从开始菜单打开 Qt 命令行,输入命令 :
cd /d D:\hellomw
然后使用 windeployqt 工具命令:
windeployqt hellomw.exe

然后可以在 D:\hellomw 文件夹里看到 windeployqt 工具自动复制的插件文件夹
和 dll文件、qm文件。这时候得到的就完整的 exe 程序发布集合,依赖关系都解决好了。

把 D:\hellomw 文件夹 打包就可以发布了,不用自己一个个找 dll 文件了。
D:\hellomw 文件夹里的qm文件是多国语言翻译文件,不需要可以删了,
其他的都保留。

2、Qt Quick Application发布方式
首先用 QtCreator 新建一个 Qt Quick Application 项目,直接用默认的项目模版,点击下一步生成项目,项目名字假定是 helloqml。
然后以 Release 方式编译生成 exe 程序:

然后找到项目的构建目录,比如项目源码目录 C:\QtPros\helloqml,
它的构建目录是:
C:\QtPros\build-helloqml-Desktop_Qt_5_4_0_MinGW_32bit-Release\
进入这个目录,再进入 release 子文件夹,找到 helloqml.exe ,
复制到一个新的单独的文件夹里面,比如 D:\helloqml\ 文件夹里面。

然后从开始菜单打开 Qt 命令行,进入D:\helloqml\文件夹:
cd /d D:\helloqml
然后使用 windeployqt 工具命令:
windeployqt helloqml.exe –qmldir C:\Qt\Qt5.4.0\5.4\mingw491_32\qml

注意不要跟烧包一样照抄上条命令,–qmldir 是指出 Qt 库里面的 qml 文件夹位置,
上面命令里 C:\Qt\Qt5.4.0 是 Qt 官方开发环境安装的文件夹,
C:\Qt\Qt5.4.0\5.4\mingw491_32 是Qt类库的目录(QTDIR),
因此使用的 –qmldir 后面写的是 C:\Qt\Qt5.4.0\5.4\mingw491_32\qml 
读者Qt环境安装路径不一样,要根据实际情况修改!

然后可以看到 D:\helloqml 文件夹里有一大堆文件,就是 QtQuick程序需要的依赖文件。
将整个 D:\helloqml 文件夹 打包就可以发布出去,在别的电脑上使用。

这个 D:\helloqml 文件夹里的东西很多,看不懂就不要删,老老实实打包发布就行了。

上面是最简单的程序发布,实际复杂程序可能还带一些图片文件、数据库文件、配置文件之类的,可以按自己需要添加这些文件到发布文件夹里面。


之后打开CMD命令操作窗口,进入windeployqt.exe所在的目录,执行 windeployqt.exe  存放文件夹  项目.exe 

程序就会将所依赖的库放到执行的存放文件夹中

例如我要放的文件夹是桌面上的APP1文件夹,项目可执行程序时HID.exe,则进入windeployqt.exe所在目录执行以下命令:

windeployqt.exe  C:\Users\Desktop\APP1  HID.exe

此时双击HID.exe就可以运行了,将整个文件夹拷贝到另一台没有安装QT的电脑上也可以运行。

二、打包应用程序和动态依赖库

  应用程序的我这里用Inno Setup Complier软件进行操作,下载网址:http://www.jrsoftware.org/isdl.php#stable

  安装完成后打开Inno Setup Complier,选择使用向导新建脚本文件

填写程序名称、版本、发布者、网站等信息

将.exe文件和依赖的动态库以及文件夹全部添加进去

填写需要的信息 ,修改安装文件的名称

选择现在编译,且保存脚本文件,也可以修改脚本文件从而修改安装的信息

之后就可以在相应的文件夹下找到对应的.iss脚本文件以及Output里面的Setup文件,运行Setup文件,安装成功且成功运行则打包完成。

利用Qt Creator在本机电脑上直接运行编译后的程序,以及发布release程序

一、填坑,输出debug和release路径问题
在QtCreator中新建项目时会提示你创建构建目录,分别是Debug和Release。
默认情况下创建规则:
../build-%{CurrentProject:Name}-%{CurrentKit:FileSystemName}-%{CurrentBuild:Name}
其中: eg:build-photosurface-Desktop_Qt_5_8_0_MSVC2015_64bit-Debug
../:上级目录,即工程文件夹同级的目录;
build-:固定字符;
%{CurrentProject:Name}:利用宏创建的工程名;
%{CurrentKit:FileSystemName}:当前构建套件名,取决于你Qt版本。
如:Qt5.8.0 MSVC2015版本生成Desktop_Qt_5_8_0_MSVC2015;
%{CurrentBuild:Name}:构建目标,Debug或者Release
比如创建一个名为photosurface的工程放到C:\Qt\Qt5.8.0\Examples\Qt-5.8\quick\demos目录,
默认会创建如下目录结构:

想把debug和release放到项目文件夹下怎么办?
将工具–>选项–>构建和运行中的Default build directory:
../build-%{CurrentProject:Name}-%{CurrentKit:FileSystemName}-%{CurrentBuild:Name}
修改为
./build-%{CurrentProject:Name}-%{CurrentKit:FileSystemName}-%{CurrentBuild:Name}
其中./为同级目录,../为上级目录
把QtCreator关闭,把工程目录下后缀名为.pro.user的文件删掉;
用QtCreator打开工程,会提示你创建构建目录,此时提示的就是你修改后的Default build directory中填写的目录;
note: 其中.pro.user文件记录了编译器、构建工具链、构建目录、版本……等工程编译相关信息,想要更换项目的编译环境,得删除这个文件,由QtCreator自动重新创建。
二、在本机直接运行编译后的程序
一步到位的方法:
添加系统环境变量:Path:C:\Qt\Qt5.8.0\5.8\msvc2015_64\bin
note:程序要用管理员程序运行

三、开始发布release程序
将release中的.exe程序,和所依赖的动态库.dll(C:\Qt\Qt5.8.0\5.8\msvc2015_64\bin)放到待发布的文件中,依赖的dll可以根据程序运行出错的提示来找到是哪几个。
将C:\Qt\Qt5.8.0\5.8\msvc2015_64\plugins目录中的platforms文件夹复制过来,不需要改文件夹名称,里面只需要保留qwindows.dll即可。
如果程序中使用了png以外格式的图片,要将C:\Qt\Qt5.8.0\5.8\msvc2015_64\plugins中的imageformats文件夹复制到待发布的文件夹中,其中保留自己用到的文件格式的.dll文件。
类似的如果使用了数据库,则把sqldrivers文件夹复制过去,里面保留用到的数据库.dll文件
其他的动态库文件类似。
发布程序的文件夹形式:

  • 接下来即可发布程序。

完成C++界面程序后,我们还需要对程序进行Release,然后进行打包,才可以直接运行。我在这期间绕了一个大弯,现在记录下来我的做法供参考。

正确步骤

第一步:将构建程序改为Release,然后构建项目。之后,你会发现在源文件夹内多了一个带有Release字样的文件夹。

第二步:将该文件夹内你的运行程序,(xxx.exe),复制到一个新的文件夹。

第三步:打开QT自带的命令行工具,不要直接用系统命令行,然后cd到你建立的新文件夹(cd是命令),使用命令:windeployqt    xxx.exe

OK,完成以上三步以后,就可以点击exe文件直接运行了。

我的错误

我之前参考了《参考文档:https://www.shintaku.cc/posts/qt/》所述的方法,发现打包完成后缺少一部分dll文件,于是又去复制该文件,结果出现了“应用程序无法打开(0x0000007b),请关闭程序”的问题,为了解决这个问题我又去找了很多资料,下载了VS2013等等,做了很多麻烦的事情还是无效。事实上,使用QT自带的命令行工具的windeployqt命令一般不会出现这种问题,而是我使用了系统命令行中的windeploy.exe导致了此类问题的发生。

注意

本文是基于QT5.7的,我不确定在其他版本出现该类问题是否可以这样解决,仅供参考。如果发现执行以上步骤后仍然显示缺少dll文件,请按网上的参考方法解决。

作者:

喜欢围棋和编程。

 
发布于 分类 编程标签

发表评论

电子邮件地址不会被公开。