Qt · 2025年4月30日

Qt Windows windeployqt.exe 打包并解决依赖问题

Qt 应用都会依赖诸多类似 QtCore.dll、QtWidgets.dll 等的情况。然而会遇到开发多个应用的场景,但是,要为每一个应用都建立好依赖,会导致占用很大的空间。
因此,对于 QtCore.dll、QtWidgets.dll 这些共用的动态库,就可以将其放置在共享路径下,多个应用共享该动态库。该章节仅讲述如何打包建立应用目录框架,需要手动添加环境变量,自动添加变量需要借助安装包工具(advance installer)加载,在后续文章中分享。

故,按照此思路,项目结构如下:

appSet/
├── env/    # 存放所有共用的 dll
│   │─ Qt5Core.dll
│   │─ Qt5Gui.dll
│   │─ ...
│   └── plugins/ # 存放 Qt 的插件路径
│       ├─ platforms/
│       │   └─ qwindows.dll
│       └─ ...
├── app_a/
│    ├─ app_a.exe       # 应用A 主程序
│    └─ qt.conf         # 配置文件
│
├── app_b/
│     ├─ app_b.exe       # 应用B 主程序
│     └─ qt.conf         # 配置文件

以 windows x64 为例,为了确保 Qt、C 依赖均被正确安装,因此第一步需要建立 Qt + VC 环境。

  1. 在 win 菜单中,运行 visual studio 中的 x64 Native Tools Command Prompt for VS 2022,即可进入 VC 环境;
    file
  2. 找到电脑中 Qt 的安装路径,在对应构建套件中找到 qtenv2.bat 或 qtenv.bat,例如:D:\Qt\5.15.2\msvc2019_64\bin;
    file
  3. 在 x64 Native Tools Command Prompt for VS 2022 窗口中,调用 D:\Qt\5.15.2\msvc2019_64\bin;
    file
  4. 至此,就建立好了 Qt + VC 环境

将开发好的应用程序(appA.exe)复制到空白路径下,例如 appSet/appA/appA.exe,在命令行中切换到该路径,并执行

windeployqt --release --dir ../env --plugindir ../env/plugins  appA.exe

其他应用也是如此,最终如下图所示
file

在每一个应用文件夹下创建 qt.conf,内容如下

[Paths]
Prefix = ../env
Plugins = ./plugins
Translations = ./translations

至此,项目目录已创建完毕,最后在系统环境变量PATH 中添加 F:\appSet\env,此时,每一个应用即可依赖共享库而独立运行。

若需要提供用户安装程序并自动创建环境变量,则需要用安装包工具,例如 advance installer 创建安装包,详情参考另一文章。