目录
2.1 使用 Qt 自带的 windeployqt.exe 寻找依赖文件
4.2 ICU 依赖库「International Component for Unicode,Unicode工具」
4.4 EGL 依赖库,为 OpenGL, OpenGLes 提供接口
一、如果有缺的文件包。dll。看这里。
所需要的。dll文件位置如下:
C:\Users\XXXXXXXX\Desktop\progress\Project_RTLS-V20180824\armadillo-3.930.0\lib
里面包含了如下文件:
因此copy即可。
二、所有dll文件搜集集合的操作方法
Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行。因此 Qt 官方开发环境里自带了一个工具:windeployqt.exe。
以官方 Qt 5.4.0+MinGW 开发环境为例,windeployqt工具在 %QTDIR%\Qt5.4.0\5.4\mingw491_32\bin 目录下,其中 QTDIR 是 Qt 的安装目录,是环境变量。
在集成开发环境 QtCreator 中可选择 “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 文件夹里的东西很多,看不懂就不要删,老老实实打包发布就行了。
上面是最简单的程序发布,实际复杂程序可能还带一些图片文件、数据库文件、配置文件之类的,可以按自己需要添加这些文件到发布文件夹里面。
二、二其他方法(上面没问题的话可以直接跳过,到第三步)
编译为 release 版本之后,找到生成的目录,其中只有 exe 扩展名的可执行文件是有用的。
编译生成目录
直接打开可执行文件,会提示找不到 dll 文件,解决方法如下:
2.1 使用 Qt 自带的 windeployqt.exe 寻找依赖文件
在 cmd 中,运行如下命令:
<Qt目录>\Qt5.5.1\5.5\mingw492_32\bin\windeployqt.exe <*.exe>
程序会找到该可执行程序所需的所有依赖文件,并集成进该可执行文件所在的目录:
windeployqt 寻找依赖
有时程序会提示找不到所需的 gcc.exe,只需要将随 Qt 安装的 mingw 的 bin 目录添加到系统的环境变量中即可。之后执行可执行文件即可成功运行。
2.2 手动集成所需的依赖文件
这里,我们可以用 Process Explore 来获取所依赖的 dll 文件「Dependency Walker软件也是不错的选择」
打开 procexp.exe,选择菜单 -> View -> Lower Pane View ->DLLs 勾选此选项,显示 dll 窗口。
在 Qt Creater 中,调试运行要发布的程序,在 Process Explore 中,找到该 exe 文件并选中,在下面就看到依赖的 dll 了。
Process Explore寻找依赖
Process Explore寻找依赖
Dependency Walker寻找依赖
Dependency Walker寻找依赖
系统目录下的,一般不用关心,按 Path 排序,寻找 Qt 目录及 mingw 目录下的 dll 文件,将这些 dll 拷贝至发布程序目录下。
以 mingw 版 Qt 为例「VS版本安装目录有些许不同」,dll 文件在 Qt 安装目录下:
<Qt安装目录>\Qt5.5.1\5.5\mingw492_32\bin
找到所有所需的 dll 文件,复制到要发布程序的目录下
Qt运行目录
例如,本程序需要如下依赖:
该程序所需依赖
三、打包为单个可执行文件
打包工具,这里选用 Enigma Virtual Box,运行软件,选择发布程序的可执行文件路径以及生成文件的路径,左下角的“添加”按钮添加所有的 dll 文件,不包含刚才选择的 exe 文件。点击右下角的「文件选项」,选中「启用文件虚拟化」以及「压缩文件」,如图所示:
Enigma Virtual Box的使用
最后点击右下角的“执行封包”,生成的 exe 文件的容量小了很多,并且这是一个纯粹的「绿色软件」,直接复制就能在任何存储介质上运行了。
另外方法
接着就需要把这些文件打包成一个exe文件了,我们可以用Enigma Virtual Box这款软件, 现在最新的版本已经是7.4了,百度一搜索就有,然后就开始添加文件打包了:
最后点击“执行封包”就能生成一个exe文件,如图示:
于是这个打包好的程序就可以放到其他电脑上运行啦。
(5)如果有需要制作成安装包程序可以使用Inno setup这款软件制作安装包,当然网上还有很多其他类似的,就需要大家自己去尝试啦,制作安装包的方法也是类似的,准备所需要的文件之后添加进去就可以了,网上很多这样的教程,大家参考这篇博文:http://blog.csdn.net/ruifangcui7758/article/details/6662646。
总结,我测试过很多次打包成exe在其他电脑上运行都是没有问题的,但是在群里跟他人讨论的时候他们说在某些情况还是会遇到问题,比如用到OpenGL库,一些第三方库如opencv等这样打包运行时就会出问题,我估计是
qt自带的windeployqt.exe这款工具有些库还是找不到的,尤其是外部的库,也就是说还是有一定的局限性,当然这只是我的猜测,我现在还没遇到,等遇到这种情况的时候我会再去寻找解决方法的,到时会继续更新这篇博文。
若有什么错漏之处,欢迎大家指出,共同学习,一起进步啦!!
4. Qt5 主要依赖链接库说明
4.1 Qt 模块库
- Qt5Core.dll #QT核心库
- Qt5Gui.dll #QT Gui库
- Qt5Widgets.dll #QT Widgets库,QT 5中GUI程序基本都需要此dll
- 还有其他程序用到的Qt5XXX.dll
4.2 ICU 依赖库「International Component for Unicode,Unicode工具」
- icudt51.dll
- icuin51.dll
- icuuc51.dll
4.3 Qt 插件库「新增库,路径必须正确」
根据不同的程序,需要不同的插件库。例如 QT_DIR/plugins/*/*.dll
,需要将 platforms/*.dll
, accessible/*.dll
的文件结构保留,放在你所编译的程序所在目录,例如:
plugins/platforms/qwindows.dll
plugins/accessible/qtaccessiblewidgets.dll
4.4 EGL 依赖库,为 OpenGL, OpenGLes 提供接口
- libEGL.dll
- libGLESv2.dll
4.5 mingw 依赖库「msvc 编译则无需这些库」
- libgcc_s_dw2-1.dll
- libstdc++-6.dll
- libwinpthread-1.dll
4.6 VC 运行库「mingw 编译则无需这些库」
- msvcr110.dll「对应VS2012」
- msvcp110.dll