乐趣区

程序打包问题及解决方法汇总

一直来被问得最多的是关于windows 系统上程序打包上问题,不能运行,在我的机器能运行,别的机器不能运行的情况。经过一段时间的整理,将一些问题和解决方法都列出来供大家参考。

0x00

  小白:怎么我编译好的程序在 QtCreator 能运行,但我在文件夹下打开却不行了呢?
  Qt 君:因为 QtCreator 运行下的程序附带了 运行环境 ,而离开了 QtCreator 软件没有运行环境会报以下的一些错误( 库找不到)。




0x01

  小白:那我该怎么找这些库呢?
  Qt 君:你可以根据你的 编译配置 (Qt 版本,编译器,32/64 位,release/debug) 来选用 不同的windeployqt.exe 工具帮你生成 Qt 依赖的运行库。

  • 一般程序生成方法:
windeployqt xxx.exe
  • 如果是使用 QML 组件 需要这样操作:
windeployqt xxx.exe --qmldir qmlPath
  • 注意: 请使用 Qt 提供的控制台操作。
  • 可以参考 Qt 快捷打包程序方法获取更多信息。

0x02

  小白:怎么会出现 PTLib.dll 找不到的问题?
  Qt 君:由于 windeploqt.exe 工具并 不能找到第三方库,这时候需要自己对应将库复制到程序的运行目录下。

0x03

  小白:0xc000007b 错误代码这个又怎么了?


  Qt 君:可能是你打包时候 使用了版本不对应的 windeploqt.exe 工具,你当时使用的是什么版本的 windeploqt.exe?
  小白:Qt5.12.2 (MSVC 2017 64-bit)


  Qt 君:你的程序版本是 Qt5.12.2 (MSVC 2017 32-bit),而 windeploqt.exe 版本是生成 64 位 的库不对咯,你修改为对应的 windeploqt.exe 就可以了。

0x04

  小白:” 无法找到入口 ”?

  小白:哦,我明白了。我使用了 mingw 版本 的 windeploqt.exe 与程序使用 MSVC 编译器不一样 导致生成的程序库找不到入口。
  Qt 君:不错,学会举一反三了。

0x05

  小白:现在才举一反二,还差一例就举一反三了。在使用 windeploqt.exe 过程中,看到有一个 --release 参数,在 msvc 的 windeploqt.exe 下似乎默认为 release 参数,但我使用 mingw 时候却生成的是 debug 版本的程序库 (例:Qt5Cored.dll 带d 标识)。我还是每次生成之前都输入 --release--debug参数了,以防万一。

0x06

  小白:这个问题很诡异,它又不提示库找不到,就显示了这信息,该怎么解决呢?

  Qt 君:造成这一问题有很多,但最有可能的是没有生成 platforms/qwindows.dll 插件。你可以尝试删除目录下的库再重新生成试一试,或者在对应的 Qt 安装目录下复制 platforms/qwindows.dll 插件到自己程序的运行目录下。注意要带上platforms 目录

0x07

  小白:我用本机能运行,但在其他机器不能运行?
  Qt 君:主要是 缺 windows 相关库
复制以下路径的库文件到运行目录下:

C:\Windows\System32 (注意:32 位编译程序复制)
C:\Windows\SysWOW64 (注意:64 位编译程序复制)

0x08

  小白:这次太糟了,双击程序完全没反应,只是一个简单的 QML 应用,怎么回事呀?
  Qt 君:由于 QML 应用大量使用了插件形式的缘故吧。比如 import QtQuick.Shapes 1.12 则会在程序运行时加载 Shapes 模块插件。你可以这样,在程序的项目文件添加 CONFIG += console 然后在命令行执行,看调试输出。因为 qml 没有断言输出,导致不能弹框警告错误。
  小白:运行后看调试输出貌似是缺少Shapes 模块

C:\Users\Strong\Documents\Deploy>Test.exe
QQmlApplicationEngine failed to load component
qrc:/main.qml:3 module "QtQuick.Shapes" is not installed

  Qt 君:由于 windeploqt.exe 工具并不能解析到程序加载的插件,这就导致某些插件没有被复制到,需要手动复制添加 Shapes 插件。

  解决方法

  • 将 Shapes 目录
C:\Qt\Qt5.12.2\5.12.2\msvc2017\qml\QtQuick\Shapes 
  • 复制到运行目录 (C:\Users\Strong\Documents\Deploy) 的 QtQuick 目录下
C:\Users\Strong\Documents\Deploy\QtQuick

  如出现以下问题还需要将 Qt5QuickShapes.dll 复制到程序运行目录下

C:\Users\Strong\Documents\Deploy>Test.exe
QQmlApplicationEngine failed to load component
qrc:/main.qml:3 plugin cannot be loaded for module "QtQuick.Shapes": Cannot load library C:\Users\Strong\Documents\Deploy\QtQuick\Shapes\qmlshapesplugin.dll
  • Qt5QuickShapes.dll 文件
C:\Qt\Qt5.12.2\5.12.2\msvc2017\bin\Qt5QuickShapes.dll
  • 复制到运行目录下
C:\Users\Strong\Documents\Deploy\

0x09

  • 复制文件到其他机器过程中导致 文件损坏 运行不了。
  • 版本不一致 的程序库会知道各种奇怪问题。如:5.12.1 的程序放在 5.12.2 库中。
  • 找缺库的工具还可以使用​depends.exe

0x0a

  • Qt 君公众号后台回复『打包问题』获取更多相关信息。
退出移动版