关于在windows下部署发布QT程序的总结

本文详细介绍在Windows环境下部署QT程序的方法,包括静态编译和动态编译两种方式,并提供了解决常见问题的具体步骤。

关于在windows下部署发布QT程序的总结(转)

本文原址链接:http://hi.baidu.com/jzinfo/blog/item/c17c3f6d4ff439fe431694c3.html


以下包括了部分网上收集的,以及qt帮助里的内容(Deploying an Application on Qt/Windows)

部署发布QT程序有两种方法:
第一种,静态编译,可生成单一的可执行文件。
第二种,动态编译,需同时附上需要的dll文件。

一、静态编译

1 编译QT。
要静态编译,首先要求QT是静态编译过的。在QT目录下执行:

configure.exe -static -release
make sub-src

就可以编译出静态库。如果只是用来分发程序,也可以mingw32-make release sub-src只编译一个静态库。
这个过程需要1-2个小时。QT目录会变成1.8G左右。注:mingw32-make和make是一样的。

如果用VC2005平台,在编译Qt的时候,configure.exe -static -platform win32-msvc2005
然后nmake sub-src或者nmake release sub-src完成静态编译。

2 编译程序。
然后到你自己的程序目录下执行:

make clean
qmake -config release
make

这时会得到一个非常大的可执行程序,但也会有一个重要的问题,就是图片文件显示不出来。
按照QT帮助的说法,QT里的jpeg,gif等图片的支持都是以插件的形式存在的,现在我们还没有包含任何插件。

3 加入插件

在main.cpp里:
#include <QApplication>
#include <QtPlugin> //这个

Q_IMPORT_PLUGIN(qjpeg) //这个
Q_IMPORT_PLUGIN(qgif) //这个

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

return app.exec();
}

在.pro里加入:
QTPLUGIN += qjpeg qgif
CONFIG += static

QT的帮助里就做到这里,但我编译程序时出错如下:
release/main.o(.text+0×1c9):main.cpp:
undefined reference to `qt_plugin_instance_qgif()’
undefined reference to `qt_plugin_instance_qjpeg()’

经过长时间研究,发现了解决问题的办法:

4 加入LIBS
在.pro中加入:
LIBS += C:/Qt/4.3.3/plugins/imageformats/libqgif.a
LIBS += C:/Qt/4.3.3/plugins/imageformats/libqjpeg.a
如果QT静态编译正确的话,你应该上面这个目录下看到这两个文件libqgif.a和libqjpeg.a (据说以前的QT版本也可能是.lib或.o文件)

这时已经可以正常编译运行了。但还是需要mingwm10.dll才能运行。

5 解决MinGW的mingwm10.dll依赖问题

在Makefile.release里找到:

LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -static -Wl,-s -Wl -mthreads -Wl, -subsystem,windows

删除其中的”-mthreads”

quote:
一般只有用到threads的时候才用到mingwm10.dll,我们通常遇到的”缺少mingwm10.dll”问题,可以在程序qmake生成 makefile.release文件后删除”-mthreads”参数即可,一般在 “LFLAGS”后面。当然,这只是临时解决方案,每次都要手动修改,也可以在编译QT前先修改qmake.h,不过不推荐这种方法。其实, mingwm10.dll也就十多K,每次发布程序时一起打包也无所谓。
更多信息可以参考:
http://lists.trolltech.com/qt-interest/2006-08/thread00942-0.html
http://lists.trolltech.com/qt-interest/2005-10/thread00381-0.html#msg00553

这时编译同样得到一个非常大的可执行程序(我写的这个贪吃蛇一共500多行,生成的exe有8M)。用AspPack压缩一下。就可以发给用户了(这时是2.6M)。
quote: “这样编译出来的程序比较大,可以先用strip命令去掉程序里面一些无用信息后,用ASPack或者UPX之类的压缩加壳软件压缩一下,两者的压缩率基本都达到30%多一点,压缩效果还是很明显的。”


二、动态编译

动态编译就很容易了。用QT的默认安装,把生成的release下的exe文件,和下面几个核心文件放在一个文件夹里:

MINGWM10.DLL
QTGUI4.DLL
QTCORE4.DLL

VC2005编译程序运行时需要的几个dll文件
Microsoft.VC80.CRT.manifest 位于x:/Program Files/Microsoft Visual Studio 8/VC/redist/x86//Microsoft.VC80.CRT
msvcm80.dll
msvcp80.dll
msvcr80.dll
QtCore4.dll
QtGui4.dll

这样就可以运行了。但图片文件还是可能显示不出来,解决办法:
把程序文件夹里,建立一个imageformats目录(必须是这个名字),把qt目录下的plugin/imageformats目录下对应的dll文件copy过去。这样动态连接就完成了。

注:可以用微软的Dependency Walker tool工具,就是一个depends.exe的程序,来查看一个exe文件跟哪些dll关联。

注:需要在完全没有装QT的系统上测试发布的程序有没有DLL依赖问题。
文章出处:DIY部落(http://www.diybl.com/course/3_program/vc/vc_js/20090307/159168.html)

<think>好的,我现在需要帮助用户了解如何在Windows系统上部署QT程序。用户之前已经询问过相关问题,现在需要详细的教程。首先,我得回顾一下之前提供的引用内容,看看有哪些信息可以利用。 引用1提到qt源码编译和部署方式,但用户现在更关心Windows下的部署。引用2和3都是关于Windows部署的具体步骤,特别是使用windeployqt工具,还有手动拷贝必要的DLL和QML文件。引用4提到了Linux下的部署,但用户现在需要的是Windows,所以这部分可能不太相关。 用户的主要需求是Windows上的QT程序部署教程,所以需要整理一个清晰的步骤。根据引用2,windeployqt是关键工具,可以自动收集依赖的DLL。但需要注意必须使用Qt自带的命令提示符,否则可能会出错。另外,引用3提到如果遇到QML模块或图表库的问题,可能需要手动复制相关文件,比如Qt5Charts.dll或者QtCharts文件夹。 接下来需要分步骤说明,确保用户能逐步操作。首先,编译Release版本的程序,然后使用windeployqt自动部署,接着处理可能的QML依赖,最后测试是否成功。同时,要提醒用户注意路径的正确性,以及如何处理第三方库的情况。 可能的问题点包括:使用错误的命令提示符导致部署失败,遗漏QML模块,或者忘记处理第三方库。需要将这些注意事项包含在教程中,帮助用户避免常见错误。 最后,生成相关问题,帮助用户深入理解部署过程,比如如何解决依赖缺失、处理QML模块或优化安装包体积。这些问题应该基于教程中的内容,引导用户进一步学习。</think>### Windows系统下QT程序部署分步指南 一、准备编译环境 1. 使用MSVC或MinGW编译器生成Release版本可执行文件 2. 确认生成目录结构规范,建议使用独立构建目录如`build-release` 3. 确保Qt安装时已勾选`Qt Debug Information Files`组件(用于获取调试符号) 二、自动依赖收集(核心步骤) ```powershell # 在Qt命令行执行(必须使用开始菜单中的Qt命令行) windeployqt.exe your_app.exe --qmldir <QML目录路径> ``` *参数说明* - `--qmldir`:指定项目使用的QML文件目录路径,确保自动收集QML依赖 - `--compiler-runtime`:包含VC++运行时库(适用于MSVC编译版本)[^2] 三、手动补充依赖 1. 复制Qt安装目录下的必要组件: - `plugins/platforms` 目录(图形后端) - `qml` 目录中的使用模块(如QtQuick.2) - 特殊模块需单独处理: ```bash # 例如Qt Charts模块 cp D:\Qt\5.15.2\msvc2019\bin\Qt5Charts.dll ./deploy cp -r D:\Qt\5.15.2\msvc2019\qml\QtCharts ./deploy/qml ``` 2. 处理第三方库依赖(如OpenCV、Boost等) 四、部署验证 1. 在纯净测试机上运行`dependencywalker.exe`检查依赖完整性 2. 使用Process Monitor监控运行时文件加载情况 3. 验证QML组件加载: ```qml // 测试QML文件 import QtQuick 2.15 import QtQuick.Controls 2.15 ``` 五、打包优化方案 1. 使用UPX压缩可执行文件(3-5%体积缩减): ```cmd upx --best your_app.exe ``` 2. 制作NSIS安装包时包含VC++可再发行组件包 3. 通过`strip`命令移除调试符号(需保留.pdb文件备用) [注意事项] 1. 混合使用MSVC/MinGW组件会导致运行时崩溃 2. Qt6版本需要特别注意OpenGL后端兼容性 3. 高DPI支持需在manifest中声明: ```xml <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness> </windowsSettings> </application> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值