![45d90c9fa546d73ee5e682a3709fc192.png](https://i-blog.csdnimg.cn/blog_migrate/b3b3f65d320521346da24f7522a950e3.png)
一直来被问得最多的是关于windows系统上程序打包上问题。经过一段时间的整理,将一些问题和解决方法都列出来供大家参考。
0x00
小白:怎么我编译好的程序在QtCreator能运行,但我在文件夹下打开却不行了呢?
Qt君:因为QtCreator运行下的程序附带了运行环境,而离开了QtCreator软件没有运行环境会报以下的一些错误(库找不到)。
![0aef74426b43666800614b0f9b149c0f.png](https://i-blog.csdnimg.cn/blog_migrate/7d2634275654de6c39bc8c2c5a22d197.png)
![04d23f6f3cd157847ed48604f51ef958.png](https://i-blog.csdnimg.cn/blog_migrate/4bf8758605f7e4061ac116b7b5413070.png)
0x01
小白:那我该怎么找这些库呢?
Qt君:你可以根据你的编译配置(Qt版本,编译器,32/64位,release/debug)来选用不同的windeployqt.exe工具帮你生成Qt依赖的运行库。
![ebbcec58f6284f4f92dceadfdb2a5ca2.png](https://i-blog.csdnimg.cn/blog_migrate/f32f96e93896d3a5558724054dc9aaf6.png)
- 一般程序生成方法:
windeployqt xxx.exe
- 如果是使用QML组件需要这样操作:
windeployqt xxx.exe --qmldir qmlPath
- 注意: 请使用Qt提供的控制台操作。
0x02
小白:怎么会出现PTLib.dll
找不到的问题?
Qt君:由于windeploqt.exe工具并不能找到第三方库,这时候需要自己对应将库复制到程序的运行目录下。
0x03
小白:0xc000007b错误代码这个又怎么了?
![ac5fd053b126ecc497b42e8ddd57652e.png](https://i-blog.csdnimg.cn/blog_migrate/5ac05b66f9d3d91f22eca375ac8ccd61.png)
Qt君:可能是你打包时候使用了版本不对应的windeploqt.exe工具,你当时使用的是什么版本的windeploqt.exe?
小白:Qt5.12.2 (MSVC 2017 64-bit)
![5276598b73dafa498edd71a5520f556c.png](https://i-blog.csdnimg.cn/blog_migrate/b538e501b0cb929f349237c9f8e10d83.png)
Qt君:你的程序版本是Qt5.12.2 (MSVC 201732-bit),而windeploqt.exe版本是生成64位的库不对咯,你修改为对应的windeploqt.exe就可以了。
0x04
小白:“无法找到入口”?
![e69bdab2085b3c8e7d65170a7792d7f5.png](https://i-blog.csdnimg.cn/blog_migrate/3e7897c6b919e5e9b0f44e63b9d9f104.png)
小白:哦,我明白了。我使用了mingw版本的windeploqt.exe与程序使用MSVC编译器不一样导致生成的程序库找不到入口。
Qt君:不错,学会举一反三了。
0x05
小白:现在才举一反二,还差一例就举一反三了。在使用windeploqt.exe过程中,看到有一个--release
参数,在msvc的windeploqt.exe下似乎默认为release
参数,但我使用mingw时候却生成的是debug版本的程序库(例:Qt5Cored.dll带d
标识)。我还是每次生成之前都输入--release
或--debug
参数了,以防万一。
0x06
小白:这个问题很诡异,它又不提示库找不到,就显示了这信息,该怎么解决呢?
![a0fbe46bf7031e291942f9723b871bc1.png](https://i-blog.csdnimg.cn/blog_migrate/869fda36038a570275b736ba2fd15a10.png)
Qt君:造成这一问题有很多,但最有可能的是没有生成platforms/qwindows.dll
插件。你可以尝试删除目录下的库再重新生成试一试,或者在对应的Qt安装目录下复制platforms/qwindows.dll
插件到自己程序的运行目录下。注意要带上platforms目录
。
0x07
小白:我用本机能运行,但在其他机器不能运行?
Qt君:主要是缺windows相关库。
复制以下路径的库文件到运行目录下:
C:WindowsSystem32 (注意:32位编译程序复制)
C:WindowsSysWOW64 (注意:64位编译程序复制)
![aaa0d5f42799bf73c7aee6607fe2c21b.png](https://i-blog.csdnimg.cn/blog_migrate/e353a6f178ab6b7a8089942ce7331aca.jpeg)
0x08
小白:这次太糟了,双击程序完全没反应,只是一个简单的QML应用,怎么回事呀?
Qt君:由于QML应用大量使用了插件形式的缘故吧。比如import QtQuick.Shapes 1.12
则会在程序运行时加载Shapes
模块插件。你可以这样,在程序的项目文件添加CONFIG += console
然后在命令行执行,看调试输出。因为qml没有断言输出,导致不能弹框警告错误。
小白:运行后看调试输出貌似是缺少Shapes模块。
C:UsersStrongDocumentsDeploy>Test.exe
QQmlApplicationEngine failed to load component
qrc:/main.qml:3 module "QtQuick.Shapes" is not installed
Qt君:由于windeploqt.exe工具并不能解析到程序加载的插件,这就导致某些插件没有被复制到,需要手动复制添加Shapes
插件。
解决方法:
- 将Shapes目录
C:QtQt5.12.25.12.2msvc2017qmlQtQuickShapes
- 复制到运行目录(
C:UsersStrongDocumentsDeploy
)的QtQuick目录下
C:UsersStrongDocumentsDeployQtQuick
如出现以下问题还需要将Qt5QuickShapes.dll
复制到程序运行目录下
C:UsersStrongDocumentsDeploy>Test.exe
QQmlApplicationEngine failed to load component
qrc:/main.qml:3 plugin cannot be loaded for module "QtQuick.Shapes": Cannot load library C:UsersStrongDocumentsDeployQtQuickShapesqmlshapesplugin.dll
- 将
Qt5QuickShapes.dll
文件
C:QtQt5.12.25.12.2msvc2017binQt5QuickShapes.dll
- 复制到运行目录下
C:UsersStrongDocumentsDeploy
0x09
- 复制文件到其他机器过程中导致文件损坏运行不了。
- 版本不一致的程序库会知道各种奇怪问题。如:5.12.1的程序放在5.12.2库中。
- 找缺库的工具还可以使用
depends.exe
。
关于更多
- Qt快捷打包程序方法
- Qt程序打包库瘦身的方法
- 发布Qt程序打包工具