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

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所在目录下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麦肯锡报告摘译:未来成功城市的14个特征

来源:TOP产业办公研究院【前言】:本文摘译自麦肯锡发布的一份研究报告。报告来源:McKinsey&Company Report: Thriving amid turbulence: Imagining the cities of the future. Authored by Jonathan Woetzel , Vineet Rajadhyaksha , Joe…

MATLAB编辑GUI界面

在命令窗口输入:guide 即可进入编辑 若要在GUI界面的一个面板上显示程序中随意给定的字符: 首先创建一个“可编辑文本”(位于左侧工具栏): 双击该面板,弹出该面板的工具栏,设置“string”&am…

单个神经元不可靠!这项新研究推翻以往认知,感知的最大限制在于解码过程...

来源:凹非寺“单个神经元不可靠!”一项关于神经元的研究,让众人看嗨了。这项研究通过在小鼠身上做实验,先展示了神经元“不靠谱”的一面:单个神经元两次对相同视觉刺激的反应,竟然是不一样的。对于神经元的…

(转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在

问题描述:在用vs生成MVC时若使用Internet应用程序为模版,项目建好后重新编译下无法通过,弹出错误: 解决方案:问题出来后,询问了身边很多人都是一头雾水,于是乎各种谷歌和百度,还好功…

QT学习笔记(四):Qt5+MSVC编译 中文字符显示乱码问题解决

QT学习笔记(四):Qt5MSVC编译 中文字符显示乱码问题解决问题:1、解决方法一:2、解决方法二:3、解决方法三:4、解决方法四:结果显示:Qt5MSVC编译 中文字符显示乱码。 现在为…

github单独下载某个文件或文件夹

首先下载tortoiseSVN,安装好之后打开github项目的地址,例如https://github.com/rbgirshick/fast-rcnn 单独下载某个文件夹: 如果只需要下载tools这个文件夹, 点进这个文件夹,复制该页面的网址得到https://github.com/…

技术架构大迁徙时代来临,10个关键点读懂数字化转型

来源:THINKTANK新智囊2月,在旧金山举办的IBM Think 2019大会上,IBM CEO、总裁及董事长Ginni Rometty提出当前正在进入数字化重塑2.0阶段(Digital Reinvention, Chapter II):数字化重塑的第二篇章&#xff0…

QT学习笔记(五):Qt5的8种标准对话框示例

QT学习笔记(五):Qt5的8种标准对话框示例前言实例展示1.颜色对话框2.文件对话框3.字体对话框4.输入对话框5.消息对框6.进度对话框7.错误信息对话框8.向导对话框.前言 QT 提供了常用的对话框类型,他们全部继承自QDialog类&#xff…

张亚勤、刘慈欣、周鸿祎、王飞跃新书推荐,《崛起的超级智能:互联网大脑如何影响科技未来》...

《崛起的超级智能:互联网大脑如何影响科技未来》2019年7月由中信出版社出版,前沿科技趋势研究专家,计算机博士刘锋著。张亚勤、刘慈欣、周鸿祎、王飞跃、约翰翰兹推荐!吕乃基、石勇、吕本富做序。《崛起的超级智能:互联…

ARM与RISC-V之争,后起之秀的优势在哪儿?

来源:朗锐智科从2010年夏天开始,伯克利研究团队大约花了四年的时间,设计和开发了一套完整的新的指令集。这个新的指令集叫做RISC-V,指令集从2014年正式发布之初就受到多方质疑,到2017年印度政府表示将大力资助基于RISC…

道阻且长,Libra 项目负责人长文回应一切质疑

来源:星球日报当地时间 7 月 3 日,Facebook Libra 项目负责人 David Marcus 于个人 Facebook 发布长文《Libra, 2 weeks in》,就过去两周 Libra 所遇到的一些质疑及误解进行解释。以下为全文内容:自 Libra 正式公开已经两周了&…

QT学习笔记(七):定时器事件的3种常用使用方式

QT学习笔记(七):定时器事件的2种常用使用方式 Qt中定时器的使用有2种方法:一种是使用QObject类提供的定时器通过重载 timerEvent 事件处理过程函数,一种就是使用QTimer类。 其中QTimer 类来实现定时器使用的更多&…

LightOJ - 1140 How Many Zeroes?

Description Jimmy writes down the decimal representations of all natural numbers between and including m and n, (m ≤ n). How many zeroes will he write down? Input Input starts with an integer T (≤ 11000), denoting the number of test cases.Each case cont…

​机器学习算法优缺点对比及选择(汇总篇)

转自:机器学习与统计学本文的目的,是务实、简洁地盘点一番当前机器学习算法。文中内容结合了个人在查阅资料过程中收集到的前人总结,同时添加了部分自身总结,在这里,依据实际使用中的经验,将对此模型优缺点…

QT学习笔记(八):顺序容器和关联容器

QT学习笔记(八):顺序容器和关联容器一、前言二、容器介绍2.1 顺序容器2.2 关联容器二、顺序容器示例三、关联容器一、前言 在Qt库中为我们提供了一系列的基于模板的容器类(container classes)。这些类可以被用来存储特定类型的项(items)。例…

页面的缓存与不缓存设置

HTML的HTTP协议头信息中控制着页面在几个地方的缓存信息,包括浏览器 端,中间缓存服务器端(如:squid等),Web服务器端。本文讨论头信息 中带缓存控制信息的HTML页面(JSP/Servlet生成好出来的也是HTML页面)在中间缓存服务器中的缓存情…

QT学习笔记(九):遍历容器-迭代器(iterators)

QT学习笔记(九):遍历容器-迭代器(iterators)遍历容器 :1、Jave风格:2、STL风格:3、foreach 关键字:遍历容器 : 遍历一个容器可以使用迭代器(iterators)完成,…

QT学习笔记(十):通用算法示例

QT学习笔记&#xff08;十&#xff09;&#xff1a;通用算法示例 std是C标准库统一使用的命名空间(namespace)的名称&#xff0c;C标准库中的名字全部都在std这个命名空间中,std也就是英文"standard"&#xff08;标准&#xff09;的缩写。 #include <QCoreAppl…

了解因果论:从珀尔的《为什么》开始

图I&#xff1a;AI从达特茅斯会议&#xff08;1956年&#xff09;得名至今已有六十年&#xff0c;期间几起几落&#xff0c;群星璀璨&#xff0c;像一个大舞台&#xff0c;你方唱罢我登场&#xff0c;留下了一些永载史册的理论和成就&#xff0c;但涉及因果的甚少作者&#xff…

外观模式(三层解耦)

说到外观模式&#xff0c;很容易想到的是设计一件漂亮的衣服然后穿上自己的身上&#xff0c;让自己看起来更加的漂亮&#xff0c;但是这个可能并不是这样子的&#xff0c;从更深层次的来说&#xff0c;外观更应该是所见即所得的&#xff0c;对于观众来说&#xff0c;看起来可能…