Qt打包成为exe遇到的问题及其解决方法

发布时间:2024年01月21日

Qt打包成为exe遇到的问题及其解决方法

0. 前言

问题描述:在执行Qt打包的过程中,我使用了Enigma virtual box工具来封包,以使得程序所需要的动态链接库能够被包含。但无论在执行封包前后,.exe文件都无法启动,在双击过之后,没有任何反应,只会在任务管理器中存在,但看不到任何窗口。

本文旨在记录解决上述问题的方法和流程,作者纯属小白,文章中难免出现错误和不成熟的见解,还望海涵。

本文方案可能并不适用于所有人,请在参考时谨慎操作。

1. 使用Release编译工程

  1. 选择正确的构建套件和Release,我这里的选择如下,因为我有一个插件在MVSC2019,所以我只能选择Qt5.15下的MSVC2019.

  1. 编译成功后,项目文件夹中会出现一个关于Release的文件夹

  1. 点开该文件夹,找到 Release 下的 .exe文件,将其复制出来放到一个新建文件夹之后,以备后续之用。

2. 利用windeployqt工具来找出和复制依赖项

该部分参考了:qt windeployqt 打包发布程序,点击可执行文件没有反应的问题

windeployqt 是 Qt 提供的一个实用工具,用于将 Qt 应用程序所需的所有依赖库和资源文件自动复制到可执行文件所在目录,以便将应用程序打包为一个独立的可执行文件。

当你使用 Qt 编写跨平台的应用程序时,通常需要将应用程序部署到不同的操作系统上,以便用户可以在没有安装 Qt 运行时的计算机上运行应用程序。这时,windeployqt 工具就能帮助你自动收集应用程序所需的依赖项,并将它们复制到一个目录中,以确保应用程序可以独立地运行。

在该部分操作过程中,由于我需要qml以及一个外部插件,因此也才导致了我之前封包后执行exe文件没有任何反应,在这里我只叙述正确的操作,而如果你不需要qml,可能以下操作中有些对你来说不是必须的。

  1. 打开对应构建套件的命令行窗口

  1. 打开刚刚所新建文件夹(我重命名为了“outexe”),并通过cd命令到该目录下

  1. 按照以下命令执行

    windeployqt 项目名称.exe --qmldir D:\software\Qt\5.15.2\msvc2019_64\qml --no-patchqt
    //windeployqt 为上面所述的工具
    //项目名称.exe即为自己项目的可执行程序
    //--qmldir D:\software\Qt\5.15.2\msvc2019_64\qml 我使用了qml所以要加上(目录为套件目录)
    //--no-patchqt, windployqt的可选项(也正是因为这个导致了运行无反应)
    

执行改行命令后,可以发现文件夹中多出了好多文件,这个时候双击 .exe文件,发现不是完全没有反应了。出现以下的提示:

说明现在只是这几个模块找不到,而不是之前的问题。

3. 解决 Qt Location /Qt Positioning is not installed

该部分参考了:打包Qt Location/Qt Positioning程序的正确姿势

  1. 首先复制对应套件下的Qt5Location.dll到刚刚新建文件夹(我的是“outexe”)的目录之下:

  1. 重新执行命令:
windeployqt 刚刚文件夹的目录\outexe\Qt5Location.dll -geoservices --qmldir D:\software\Qt\5.15.2\msvc2019_64\qml --no-patchqt

可以发现这个只不过是比之前多了刚刚文件夹的目录\outexe\Qt5Location.dll -geoservices ,就是为了解决对应的模块未安装问题的。

  1. 生成完之后将对应套件下的复制qml\QtLocation和qml\QtPositioning到outexe程序目录下为QtLocation文件夹和QtPositioning文件夹就可以了

  1. 此时点击 .exe文件,发现程序能够运行了。

4. 利用Enigma virtual box打包 .exe程序

该部分参考了:QT 软件打包为一个单独可执行.exe文件流程_qt打包成可执行程序-CSDN博客

上面exe文件虽然可以运行,但是需要和动态链接库在一个文件夹中,十分的不方便,因此可以通过封包来将这些打包到一个exe文件中。

封包的过程网上就有很多了。

  1. 首先从官网下载Enigma virtual box :https://enigmaprotector.com/en/downloads.html

  2. 安装后,直接打开,点击浏览,选中刚才的 .exe文件

  3. 增加文件夹递归,所选的文件夹就是刚刚我们一直使用的(我的是outexe)

  1. 点击右下角“文件选项”,点击压缩文件

  2. 执行封包,等待完成

此时生成的可执行文件就可以直接运行而不需要和一大堆动态链接库在一个文件夹中。

5. dependency walker工具等

dependency walker类似的工具有很多,可以帮助我们查找exe可执行文件的依赖项,并构建所有依赖模块的分层树图。但对本问题的解决没有帮助,因此只是简单记录一下。

6. 小结

本文主要讲述了Qt在导出为一个exe可执行程序时遇到的后台运行,但前台无反应的问题,并给出了解决办法。

本文参考了以下博客:

QT 软件打包为一个单独可执行.exe文件流程_qt打包成可执行程序-CSDN博客

qt windeployqt 打包发布程序,点击可执行文件没有反应的问题

打包Qt Location/Qt Positioning程序的正确姿势

dependency walker工具简介及使用-CSDN博客

QT发布打包后无法运行的问题

如果您觉得我写的不错,麻烦给我一个免费的赞!如果内容中有错误,也欢迎向我反馈。

文章来源:https://blog.csdn.net/qq_45830323/article/details/135726967
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。