QT学习笔记(三):Qt软件打包发布(QT5.8 _msvc2013_64+Win10_64)

  • 1.编译方式介绍:
  • 2.动态编译方式打包发布QT程序:
    • 方法一:手动复制
    • 方法二:使用工具
  • 问题&解决:

环境:QT5.8 _msvc2013_64+Win10_64 (MSVC 编译器)

1.编译方式介绍:

Qt开发的程序发布的时候经常采用两种方式:1)静态编译,可生成单一的可执行文件;2)动态编译,需同时附上需要的dll文件。
静态编译
  静态编译,是指把相关的库也一并引入exe文件,这样程序的尺寸就会很大,不过程序发布就会变得简单很多。
  优点: 发布简单,单一文件,在移植时如果空间足够,采用静态编译比较可靠
  缺点: 库文件很大,更新程序版本不方便。每次升级,都要重新分发所有的内容。对QT而言,需要重新编译静态库(非常耗时),且插件的使用比较麻烦;
  
动态编译(Qt默认)
  动态编译,是指相关的库,以dll动态链接库的形式引用。动态编译的exe程序比较小,因为相关的库都没有包含进来。所以程序发布的时候要把相关的库也一并发布出去。
  一般使用动态编译动态链接Qt库,尤其代码规模比较大,需要多人协作开发时,不同模块按dll划分比较方便,采用静态链接是不现实的。
  优点: 更新方便,发布多个产品时,可以统一使用一个库。
  缺点: 文件多、杂。

Debug版本
  Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

Release 版本
  Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的。一般来说,release版的可执行程序体积要比debug版小很多,而且由于剥离了许多调试信息及符号等,运行效率相对也高一些,因此一般采用release编译。

2.动态编译方式打包发布QT程序:

方法一:手动复制

采用Qt动态编译,release版本的程序。需要将相应的dll跟Qt可执行程序exe文件放在一个目录下

所需的dll文件包括:
1)Qt模块库
Qt5Cored.dll
Qt5Guid.dll
Qt5Widgetsd.dll

2)ICU依赖库
icudt51.dll
icuin51.dll
icuuc51.dll

3)EGL依赖库
libEGLd.dll
libGLESv2d.dll

4)插件库(Qt安装目录下即可找到D:\Software\Qt\Qt5.1.0\5.1.0\msvc2010\plugins\platforms)
图片支持库:imageformats
音频、视频支持库:mediaservice
平台支持库:platforms
等等…
注意:查找对应的插件文件夹,粘贴到安装目录(一定要保持目录结构,例如“platforms/***.dll”),详细结构见打包发布准备的文件组织结构。

5)VS运行时库msvcrt,如:
msvcp120.dll
msvcr120.dll
( 注意:发布程序的时候注意版本(Debug/Release)
如果是Debug版本的则是.前面带d的(Qt5Cored.dll、Qt5Guid.dll、Qt5Widgetsd.dll)
如果是Release版本的则是.前面不带d的(Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll))

6)程序中引用的第三方库,如QWT,openCV,第三方库的dll文件如qwt.dll、opencv_world300.dll。

**PS:
①.将exe文件在另一台电脑上运行时,若缺少运行所必需的dll文件,会报错——缺少dll文件。

②.C Runtime库:
问题比较多的是VC的运行时库 msvcrt。使用VC编译的C或C++程序,都需要相关的C runtime库才能运行。本文采用的是VS2013编译器,对应的就是MSVCR120。进入Microsoft.VC120.CRT 目录:

  ${VS Install Dir}\VC\redist\x64\Microsoft.VC120.CRT

就能找到C runtime库(msvcp120.dll,msvcr120.dll,vccorlib120.dll)。
从vc2005开始微软加入了manifest机制控制运行时库的加载,如果用户机器上未安装过msvcrt的distribution pack,程序就不能运行。简单的处理方法是把C runtime库一并包含进去,即将Microsoft.VC120.CRT 目录下的文件(msvcp120.dll,msvcr120.dll,vccorlib120.dll)放到exe相同的目录即可。应用程序如果找不到系统安装的msvcrt,就会加载自带的库文件。

③.Qt库
编译Qt后,将Qt生成路径(…\build-untitled-Desktop_Qt_5_4_1_MSVC2013_OpenGL_64bit-Release\release)中的exe程序放到新建的package中,Qt程序中使用到的(在.pro文件中添加的)QtCore,QtGUI,xml,sql,multimedia等相关的动态库和调用它的exe一起放在同一个目录中。

④.Qt的图片解码库比如:jpeg、gif解码等是以插件形式存在的,要包含imageformats文件夹中的dll文件,还有windows平台相关的platforms,windows中的语音相关的audio等文件夹中包含的dll文件。

对于采用动态编译的Qt可执行程序,如果不确定该程序使用了哪些必要的dll,可以使用工具查看该Qt可执行程序使用了哪些dll,见下:

方法二:使用工具

1、 通过工具,查找程序运行依赖的dll文件
最简单的方式是用Qt自带的生成必备dll文件的 windepolyqt.exe工具 (D:\Qt\Qt5.8.0\5.8\msvc2013_64\bin 目录下):windepolyqt xxx.exe

Qt for Windows - Deployment 官方文档:
https://doc.qt.io/qt-5/windows-deployment.html#application-dependencies

使用方法:将Qt的bin目录加入PATH环境,就可以直接在命令行使用windeployqt调用。将生成的xxx.exe可执行文件复制到一个空的文件夹里,进入这个文件夹 ,运行windeployqt xxx.exe,则该执行文件需要的大部分依赖文件都自动拷贝到这个文件夹里了。

2、第三方的SDK库添加
如果还使用了其他的第三方的SDK,如QWT,OpenCV等,就需要手动将所需dll拷贝过来,如果不知道还需要哪些dll文件,可以用**Dependency Walker (depends.exe)**和 微软的进程查看器 Process Explorer(procexp.exe) 来查看程序运行时还缺少哪些dll。

3、 QT程序打包发布,用户打包程序,变成(桌面)安装包,可使用工具,如 NSIS,开源工具Inno Setup进行打包。
参考博客:
NSIS 官网下载
https://nsis.sourceforge.io/Download
Qt之NSIS打包 :(NIS Edit+NSIS 方式)
https://blog.csdn.net/xuhui_liu/article/details/71721556
Inno setup 打包教程:
https://jingyan.baidu.com/article/295430f1232df70c7e0050fe.html
https://blog.csdn.net/ruifangcui7758/article/details/6662646
https://blog.csdn.net/hebbely/article/details/78168071
Qt 软件发布与打包:
https://blog.51cto.com/2678482/1616826

其他打包方式:
https://blog.csdn.net/qq_34719188/article/details/79947764

这样之后,就得到了一个在其它没有安装Qt和VS的电脑上也可以运行的Qt程序安装包了。

问题&解决:

完成上述第1步是及:从命令行模式进入该文件夹执行语句 windeployqt xxxx.exe 时提示错误,无法找到“Visual Studio安装目录,未设置VCINSTALLDIR ”,如图:

C:\Users\Leon\Desktop\新建文件夹> windeployqt HelloWorld.exe
C:\Users\Leon\Desktop\Warning: Cannot find Visual Studio installation directory, VCINSTALLDIR is not set.

解决方法:
直接用 “VS2013 开发人员命令提示” 命令行去,执行刚才的 windeployqt HelloWorld.exe,会将 “vcredist_x64.exe”(vc x64 运行最少环境)程序放入当前目录。

1)先cd 进执行程序(HelloWorld.exe)所在目录,再次运行 windeployqt HelloWorld.exe:

D:\Microsoft Visual Studio 12.0>C:
C:\>cd C:\Users\Leon\Desktop\新建文件夹
windeployqt HelloWorld.exe

结果:

2)可能还是会漏掉一些包,要多在其他电脑上进行测试,运行时会提示缺少某个dll,想办法找到该dll,这个dll你自己的电脑上一般都会有,全局搜下,复制粘贴到exe所在目录下

QT学习笔记(三):Qt软件打包发布(QT5.8 _msvc2013_64+Win10_64)相关推荐

  1. Qt学习笔记,Qt国际化

    Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\     ...

  2. Qt学习笔记,Qt程序架构设计要旨

    Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...

  3. Qt学习笔记之Qt软件的打包发布

    在QT编程结束之后,我们会运行程序,这个过程结束后会在你工程的父目录中出现一个build-simpleEditor-unknown-Debug的文件夹,其中build之后的名称就是你工程的名称.在这个 ...

  4. Qt学习笔记(Qt制作菜单栏and工具栏and状态栏)^_^

    本人是菜鸟,这里记录的每天的学习内容 学习Qt 的第四天(笑着学) 学习内容: 1)编写一个菜单栏 and 工具栏 and 状态栏                                    ...

  5. Qt学习笔记之--Qt内置图标一览表

    Qt内置了一批图标,一共有70个(Qt 5.9.5),不同的平台图标有差异.由于官方文档中只有描述没有图示,所以写个Demo把这些图标全部显示出来.下面展示了windows.Linux.android ...

  6. QT学习笔记(1): Qt的线程安全和可重用性

    原来觉得对线程安全是比较了解的,可是今天看了Nokia Developer中的Reentrancy and Thread-safty之后,发现还有有些概念没有很清楚.所以在此留点痕迹好了. 首先两个英 ...

  7. QT学习笔记(摘抄)

    QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...

  8. 学习笔记之Qt从入门到精通(三)

    整理日期: 2010年4月9日 本文是学习笔记之Qt从入门到精通(二)的接续 Part 3: 进阶学习 Qt4 学习笔记 Qt 可以运行在不同的平台,像是Unix/X11.Windows.Mac OS ...

  9. 【QT】自定义软件打包发布

    自定义软件打包发布 安装nisi和nisedit. 打开nisedit. 点击--文件--新建脚本:向导. 设置名称等信息,点击下一步. 选择安装图标--设置安装语言,点击下一步. 选择授权文件(Li ...

最新文章

  1. 库克退休前的最后一战:不是苹果汽车而是……
  2. OpenGL 具有深度恢复的SSAO
  3. C++单例模式:单例模式遇到多线程
  4. KOHA IRC 聊天室
  5. PHP CI框架如何去掉 sql 里的反引号
  6. 学习算法的网址【原创】
  7. Android Studio开发实战(新手入门)一
  8. 局域网文件快传 暂记
  9. Linux - 在yocto构建中使用i2c-tools
  10. Db4o数据库:快速入门
  11. 自定义Unity调色板
  12. springboot-2-整合myBatis及druid连接池
  13. 鸿蒙秘境怎么玩,鸿蒙秘境
  14. 0和1的艺术,与、或、非基本逻辑门电路
  15. pycharm新建工程流程
  16. 语义网络 - 语义网络
  17. webrtc jitterbuffer--buffer草稿
  18. 凤翅医话——治腰椎间盘突出
  19. 消灭该死的重复 下(1)布尔运算 boolean
  20. 【黑马程序员C++ STL】学习记录

热门文章

  1. php sem acquire,PHP | 关于php中sem_get failed for key no space left on device问题的解决方案...
  2. json和python中字典的区别和联系_Python 中json与字典的关系
  3. 知识图谱论文阅读【十二】【KDD2020】 使用贝叶斯图卷积神经网络推荐精确和多样化项目的框架【看不懂,待续】
  4. 【错误纠正】关于文章《绕开数学,讲讲信息论》
  5. 会议交流 | CCKS2020 第十四届全国知识图谱与语义计算大会
  6. 论文浅尝 | 基于多模态关联数据嵌入的知识库补全
  7. 论文浅尝 | Open world Knowledge Graph Completion
  8. Java总结:Spring5框架(1)
  9. day-17 包与模块
  10. shell-awk详细笔记