Qt 程序在 Windows 下的发布

news/2024/7/1 3:12:14
「博客搬家」 原地址: CSDN 原发表时间: 2016-06-04

本文讨论在 Windows 平台下编译成功的 Qt 程序,如何在未配置 Qt 开发环境的 Windows 平台下独立运行的方法。

经过验证发现,在 Ubuntu 平台下编译成功的程序可在未安装 Qt 开发环境下的 Ubuntu16.04 中运行,所以,本文仅讨论,在 Windows 平台下编译成功的 Qt 程序,在未配置 Qt 开发环境的 Windows 平台下独立运行的方法。

1. 编译模式选择

如若想要发布程序,在 IDE 中编译一定要选择 release 而不是 debug,编译成 release 版本相比于 debug 版本,程序体积「可执行文件和 dll 文件」大大减小;

编译模式选择

2. 集成所需 dll 文件及其他依赖库

编译为 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运行目录

例如,本程序需要如下依赖:

该程序所需依赖

3. 打包为单个可执行文件

打包工具,这里选用 Enigma Virtual Box,运行软件,选择发布程序的可执行文件路径以及生成文件的路径,左下角的“添加”按钮添加所有的 dll 文件,不包含刚才选择的 exe 文件。点击右下角的「文件选项」,选中「启用文件虚拟化」以及「压缩文件」,如图所示:

Enigma Virtual Box的使用

最后点击右下角的“执行封包”,生成的 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

5. 参考资料

  1. Qt 5.5 程序打包发布以及依赖
  2. Qt 在 Windows 上发布之所需运行库「一」
  3. 将 Qt 动态链接生成的 exe 及依赖 dll 打包方法
  4. Qt 5 编译 & 打包依赖 dll 发布

http://lihuaxi.xjx100.cn/news/237707.html

相关文章

怎么才能开发一款区块链应用

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自https://www.liankexing.com/notetwo/8174&#xff0c;未经允许拒绝转载。 要想将区块链在整体的开发和研讨过程中&#xff0c;抵达最佳的运用状态&#xff0c;需求的是在数据的存储&#xff0c;传…

fiddler教程:抓包带锁的怎么办?HTTPS抓包介绍。

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 介绍Fiddler的HTTPS抓包功能。” 这里首先回答下标题中的疑问&#xff0c;fiddler抓包带锁的原因是HTTPS流量抓包功能开启&#xff0c;但解密功能未开启导致&#xff0c;只需要将HTTPS流量解密功能开启就能解决问题。01—作为一款…

C++大数加法

1 #include <iostream>2 #include<deque>3 #include<string>4 5 using namespace std;6 7 string add(string a, string b) //此函数默认a的长度大于b(可以在main函数里用if语句控制a的长度大于b)8 {9 deque<int>sum; //sum用来存储和的每…

系统异常设计规范与原则

为什么80%的码农都做不了架构师&#xff1f;>>> 1.系统异常设计的出发点&#xff1a; 良好的异常信息展示&#xff0c;开发运维人员能快速定位问题。响应外部调用异常时&#xff0c;应能明确指明是内部异常还是调用条件不满足导至。响应用户操作异常时&#xff0c;…

区块链学习技术随笔

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自https://www.liankexing.com/notetwo/8173&#xff0c;未经允许拒绝转载。 1.什么是区块链&#xff1f; 区块链是经曩昔中心&#xff0c;化去信任的方式团体维护一个可靠数据库的技术计划。参与系…

GTP协议格式分析

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 分析GTP协议。”本文对比较枯燥的协议资料进行学习&#xff0c;有需要可继续阅读&#xff0c;找到自己关注的知识点&#xff0c;暂时无需要可直接拉到文末表示阅读结束&#xff0c;让微信记下热爱学习的你的痕迹。如果说TCP/IP协…

java python算法_用Python,Java和C ++示例解释的排序算法

java python算法什么是排序算法&#xff1f; (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions that take an array or list as an input and arrange the items into a particular order.排序算法是一组指令&#xff0c;这些指令采用数组或列表…

JHipster技术简介

本文简单介绍Jhipster是什么&#xff0c;为什么用Jhipster&#xff0c;怎么用Jhipster。 WHAT - 技术栈 JHipster是什么 JHipster是一个开发平台&#xff0c;用于生成&#xff0c;开发&#xff0c;部署Spring Boot Angular/React Web Application和Spring microservices。 JHi…