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

关于在windows下部署发布QT程序的总结
文章出处:http://www.diybl.com/course/3_program/c++/cppjs/200869/123842.html

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

首先,打开windows控制台,然后,找到vs安装目录下的bin里,执行 vcvars32.bat 这个脚本。执行完之后,vs需要的所有环境变量就已经设置好了。

然后,做下面的操作:

我的环境是QT 4.3.3 + mingw32-make

部署发布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依赖问题。

文章出处:http://www.diybl.com/course/3_program/c++/cppjs/200869/123842.html

 

 

控制台程序的话,用到QtCore4.dll,如果有GUI的话,还要加上QtGui4.dll,
相应地,如果用到了其它模块的话,也要加上相应的dll,如QtXml4.dll, QtNetwork4.dll, QtSql4.dll等。

如果用到了中文处理,要加上qcncodecs.dll,在使用到SQL数据库的时候,根据不同的驱动使用不同的插件,如qsqlmysql.dll, qsqlite.dll,qsqlodbc.dll等。
如果用到了其它的插件,相应地,还要加上对应的插件DLL。

因为使用的是mingw版的编译器,所以还要加上mingw10.dll,

时间: 2024-12-03 05:31:36

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

java-请问如何在WINDOWS下后台运行JAVA程序而不打开命令行窗口

问题描述 请问如何在WINDOWS下后台运行JAVA程序而不打开命令行窗口 请问如何在WINDOWS下后台运行JAVA程序而不打开命令行 我添加了一个任务计划但是每次运行程序的时候都会打开命令行窗口我不希望命令行窗口出现怎么办? 解决方案 @echo off 你加入这个你再试试

t程序发布-Qt程序怎么发布,让我的Qt程序在没有安装Qt的电脑上也能运行?

问题描述 Qt程序怎么发布,让我的Qt程序在没有安装Qt的电脑上也能运行? 我做了一个很小的程序,需要传给别人用,但是我在自己的电脑上都运行不了这个exe程序.我用debug文件夹下找到这个exe程序的,就是我创建的文件名.说没有动态库,我把动态库放到与这个exe程序一个文件夹下,还是这样报错,不知道怎么整了,我用的是Qt5.3.2好像,请问各位大神,我就想把我的程序脱离了Qt的IDE来运行,怎么做到? 用release好像也不行,怎么回事? 解决方案 你先要看看你缺少什么dll.然后就可以把q

windows下安装php应用程序服务器

安装 PHP 应用程序服务器 (Windows) 若要处理动态 Web 页,您需要应用程序服务器.应用程序服务器是一种软件,它帮助 Web 服务器处理包含服务器端脚本或标签的 Web 页.当浏览器请求这样一个页时,Web 服务器先将该页传递给应用程序服务器进行处理,然后再发送到浏览器.有关更多信息,请参见了解 Web 应用程序. 确保运行 IIS 的系统上安装了 PHP 应用程序服务器并且正在运行.(IIS 可能位于您的硬盘或远程 Windows 计算机上.)您可以从 PHP Web 站点(网址

在 Windows下静态编译Qt SDK

1.使用条件: (1)系统:Widows XP 萝卜版 (2)QT:QT4.6.2  windows版 2.使用步骤: (1)静态编译QT A:设置qmake.conf 用记事本打开D:\Qt\2010.02.1\qt\mkspecs\win32-g++下的qmake.conf 在"QMAKE_LEXFLAGS ="后面增加"-static",保存退出. B:运行,"开始---程序程序---Qt SDK by Nokia v2010.02.1 (open

Windows下查询运行的程序端口的命令表

我们在Windows 2000/XP/Server 2003中要查看端口,使用Netstat命令: 命令格式:Netstat -a -e -n -o -s -a 表示显示所有活动的TCP连接以及计算机监听的TCP和UDP端口. -e 表示显示以太网发送和接收的字节数.数据包数等. -n 表示只以数字形式显示所有活动的TCP连接的地址和端口号. -o 表示显示活动的TCP连接并包括每个连接的进程ID(PID). -s 表示按协议显示各种连接的统计信息,包括端口号. 关闭/开启端口 在介绍各种端口的

在win7 企业版环境下部署MVC应用程序,出现Server Error in &amp;amp;#x27;/&amp;amp;#x27; Application.错误,求各位大大帮忙看看。

问题描述 程序为MVC框架+C++接口,本地调试无错误,部署到服务器上出现这种错误.都是内网服务器,Web服务器和C++接口服务器不在一台服务器上. 解决方案 本帖最后由 Fantast1c_TAT 于 2015-12-19 12:02:42 编辑解决方案二:描述里说的很清楚啊:anexceptionoccurredwhileprocessingyourrequest估计就是调用接口出现异常了,用日志记录看看是什么异常再做处理

求高人解答:WAS 7 下部署的应用程序,添加了Virtual directories 后,使用时报错,有的页面无法显示。

问题描述 [12/28/1211:24:06:940CST]00000019servletEcom.ibm.ws.webcontainer.servlet.ServletWrapperserviceSRVE0068E:Uncaughtexceptioncreatedinoneoftheservicemethodsoftheservlet/jsp/accept/common/commonSingleOrder.jspinapplicationOdmWeb.Exceptioncreated:java

ASP.NET MVC3 on Mono的折腾(一):Windows下的部署

Mono 2.10支持MVC3和Razor的消息着实让我兴奋了好一会儿,因为支持MVC3后,我就有可能做Kooboo CMS3兼容Mono的相关测试工作.可是没一会儿,我就发现,离我的目标还是有一点距离.不晓得是Mono 2.10本身存在的bug,还是我的原因,我总是无法很完美的在Mono运行起MVC3的站点,即使是用默认的MVC3站点模板创建的非常简单的站点也是一样.长期生活在微软Windows/.NET平台的滋润环境中,没有Linux平台的使用经验和基于配置文件的Web部署习惯,让我花了不少

一起谈.NET技术,ASP.NET MVC3 on Mono的折腾(一):Windows下的部署

Mono 2.10支持MVC3和Razor的消息着实让我兴奋了好一会儿,因为支持MVC3后,我就有可能做Kooboo CMS3兼容Mono的相关测试工作.可是没一会儿,我就发现,离我的目标还是有一点距离.不晓得是Mono 2.10本身存在的bug,还是我的原因,我总是无法很完美的在Mono运行起MVC3的站点,即使是用默认的MVC3站点模板创建的非常简单的站点也是一样.长期生活在微软Windows/.NET平台的滋润环境中,没有Linux平台的使用经验和基于配置文件的Web部署习惯,让我花了不少