Qt程序打包成单个exe文件

文章目录

    • [0. 准备工作](#0. 准备工作)
    • [1. 使用 `windeployqt` 提取必要的动态链接库和资源文件](#1. 使用 windeployqt 提取必要的动态链接库和资源文件)
      • [1.1 操作步骤](#1.1 操作步骤)
      • [1.2 补充](#1.2 补充)
    • [2. 使用 `Enigma Virtual Box`将文件夹打包成单个exe](#2. 使用 Enigma Virtual Box将文件夹打包成单个exe)
      • [2.1 操作步骤](#2.1 操作步骤)

0. 准备工作

Qt程序打包用到的工具有:

  • windeployqt :安装Qt时自带
  • Enigma Virtual Box 下载地址 :免费软件

1. 使用 windeployqt 提取必要的动态链接库和资源文件

★说明: 本文仅以笔者自己的Qt程序为例进行介绍,具体项目请作相应的修改。

1.1 操作步骤

  • 步骤1. 新建文件夹,命名为iap

  • 步骤2. 拷贝这执行文件

    从Qt工程中的release文件夹中,将可执行文件拷贝到步骤1中新建的文件夹中

  • 步骤3. 打开Qt终端

    打开对应的Qt终端,本例中使用MinGW左编译器,因此打开Qt6.5.2(MinGW 11.2.0 64-bit)

    在终端中进入到步骤1中创建好的文件夹

  • 运行 windeployqt

    指令如下

sh 复制代码
windeployqt appstm32iap_desktop.exe --qmldir D:\src\qt_ws\stm32iap_desktop\build-stm32iap_desktop-Desktop_Qt_6_5_2_MinGW_64_bit-Release

其中使用 --qmldir指定了QML-Imports的搜索路径,本例中该路径为工程中release的文件夹。

1.2 补充

补充1

在其他的博客中仅使用windeployqt appstm32iap_desktop.exe即可完成。但在实际操作的过程中,打包完的exe无法运行(双击无反应),加入 --qmldir后问题解决。再此作为参考。

补充2
windeployqt具有的功能还有很多,一下列出--hekp-all的信息。

bash 复制代码
(base) PS C:\Users\HY\Desktop\iap> windeployqt --help-all
Please specify the binary or folder.

Usage: C:\Users\HY\anaconda3\Library\bin\windeployqt.exe [options] [files]
Qt Deploy Tool 5.15.2

The simplest way to use windeployqt is to add the bin directory of your Qt
installation (e.g. <QT_DIR\bin>) to the PATH variable and then run:
  windeployqt <path-to-app-binary>
If ICU, ANGLE, etc. are not in the bin directory, they need to be in the PATH
variable. If your application uses Qt Quick, run:
  windeployqt --qmldir <path-to-app-qml-files> <path-to-app-binary>

Options:
  -?, -h, --help              Displays help on commandline options.
  --help-all                  Displays help including Qt specific options.
  -v, --version               Displays version information.
  --dir <directory>           Use directory instead of binary directory.
  --libdir <path>             Copy libraries to path.
  --plugindir <path>          Copy plugins to path.
  --debug                     Assume debug binaries.
  --release                   Assume release binaries.
  --pdb                       Deploy .pdb files (MSVC).
  --force                     Force updating files.
  --dry-run                   Simulation mode. Behave normally, but do not
                              copy/update any files.
  --no-patchqt                Do not patch the Qt5Core library.
  --ignore-library-errors     Ignore errors when libraries cannot be found.
  --no-plugins                Skip plugin deployment.
  --no-libraries              Skip library deployment.
  --qmldir <directory>        Scan for QML-imports starting from directory.
  --qmlimport <directory>     Add the given path to the QML module search
                              locations.
  --no-quick-import           Skip deployment of Qt Quick imports.
  --translations <languages>  A comma-separated list of languages to deploy
                              (de,fi).
  --no-translations           Skip deployment of translations.
  --no-system-d3d-compiler    Skip deployment of the system D3D compiler.
  --compiler-runtime          Deploy compiler runtime (Desktop only).
  --no-virtualkeyboard        Disable deployment of the Virtual Keyboard.
  --no-compiler-runtime       Do not deploy compiler runtime (Desktop only).
  --webkit2                   Deployment of WebKit2 (web process).
  --no-webkit2                Skip deployment of WebKit2.
  --json                      Print to stdout in JSON format.
  --angle                     Force deployment of ANGLE.
  --no-angle                  Disable deployment of ANGLE.
  --no-opengl-sw              Do not deploy the software rasterizer library.
  --list <option>             Print only the names of the files copied.
                              Available options:
                               source:   absolute path of the source files
                               target:   absolute path of the target files
                               relative: paths of the target files, relative
                                         to the target directory
                               mapping:  outputs the source and the relative
                                         target, suitable for use within an
                                         Appx mapping file
  --verbose <level>           Verbose level (0-2).

Qt libraries can be added by passing their name (-xml) or removed by passing
the name prepended by --no- (--no-xml). Available libraries:
bluetooth concurrent core declarative designer designercomponents enginio
gamepad gui qthelp multimedia multimediawidgets multimediaquick network nfc
opengl positioning printsupport qml qmltooling quick quickparticles quickwidgets
script scripttools sensors serialport sql svg test webkit webkitwidgets
websockets widgets winextras xml xmlpatterns webenginecore webengine
webenginewidgets 3dcore 3drenderer 3dquick 3dquickrenderer 3dinput 3danimation
3dextras geoservices webchannel texttospeech serialbus webview

Arguments:
  [files]                     Binaries or directory containing the binary.

补充3

在windeployqt``可以加入--no-(xml)选项,以减少打包后的大小。本例中加入前为123MB,加入后减为57MB。最终的命令如下。

bat 复制代码
D:\Qt\6.5.2\mingw_64\bin\windeployqt.exe ^
 appstm32iap_desktop.exe --qmldir D:\src\qt_ws\stm32iap_desktop\build-stm32iap_desktop-Desktop_Qt_6_5_2_MinGW_64_bit-Release ^
--no-opengl-sw ^
--no-translations ^
--no-system-d3d-compiler ^
--no-3danimation ^
--no-3dcore ^
--no-3dextras ^
--no-3dinput ^
--no-3dlogic ^
--no-3dquick ^
--no-3dquickanimation ^
--no-3dquickextras ^
--no-3dquickinput ^
--no-3dquickrender ^
--no-3dquickscene2d ^
--no-3drender ^
--no-quick3d ^
--no-multimedia ^
--no-svg ^
--no-svgwidgets ^
--no-quick3d ^
--no-quick3dassetimport ^
--no-quick3dassetutils ^
--no-quick3deffects ^
--no-quick3dhelpers ^
--no-quick3dhelpersimpl ^
--no-quick3diblbaker ^
--no-quick3dparticleeffects ^
--no-quick3dparticles ^
--no-quick3dphysics ^
--no-quick3dphysicshelpers ^
--no-quick3druntimerender ^
--no-quick3dutils ^
--no-qmlintegration ^
--no-qmllocalstorage ^
--no-qmlxmllistmodel ^
--no-virtualkeyboard ^
--no-sql ^
--no-statemachine ^
--no-statemachineqml ^
--no-concurrent ^
--no-quicktimeline ^
--no-quicktest

可将上面指令保存到.bat的文件中,在Qt终端中运行。

2. 使用 Enigma Virtual Box将文件夹打包成单个exe

上述操作后,程序虽然被提取出工程文件夹,但依然需要进入文件夹,双击可执行程序运行。该部分将上述创建的文件夹整体打包成可执行的exe文件。步骤如下。

2.1 操作步骤

  • 步骤1:安装 Enigma Virtual Box,从官方网站进行下载,并安装(下载地址 )。
  • 步骤2:选择输入的exe文件,即上述新建文件夹中的可执行文件
  • 步骤3:选择输出的文件名。默认状态下与输入exe文件同目录,可以进行修改
  • 步骤4:添加程序运行的配套文件。

    在步骤3中选择上述新建文件夹,点击确定和OK完成添加。

    最终配置结果如下,点击Process即可生成。

结果展示

复制代码
相关推荐
DuHz1 分钟前
C程序中的数组与指针共生关系
linux·c语言·开发语言·嵌入式硬件·算法
我星期八休息4 分钟前
C++智能指针全面解析:原理、使用场景与最佳实践
java·大数据·开发语言·jvm·c++·人工智能·python
大猫会长9 分钟前
docker安装php+apache
java·开发语言
道之极万物灭23 分钟前
Go小工具合集
开发语言·后端·golang
梵得儿SHI33 分钟前
Java 反射机制深度剖析:性能与安全性的那些坑
java·开发语言·安全·反射·动态代理·性能·反射机制
fsnine39 分钟前
Python图形化界面——pyqt5教程
开发语言·python·qt
嵌入式-老费1 小时前
Easyx图形库应用(和lua结合使用)
开发语言·lua
AsiaLYF1 小时前
kotlin中MutableStateFlow和MutableSharedFlow的区别是什么?
android·开发语言·kotlin
Asuncion0071 小时前
Docker核心揭秘:轻量级虚拟化的革命
服务器·开发语言·docker·云原生
深思慎考2 小时前
RabbitMQ 入门:基于 AMQP-CPP 的 C++ 实践指南与二次封装
开发语言·c++·分布式·rabbitmq·api