• 10304阅读
  • 7回复

[提问]首先感谢XChinux----不晓得这里有没有,但是我一定要转------关于在windows下部署发布QT程序的总结 [复制链接]

上一主题 下一主题
离线senfrans
 

只看楼主 倒序阅读 楼主  发表于: 2008-06-17
— 本帖被 XChinux 执行加亮操作(2013-07-13) —
本文原址链接: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依赖问题。
[ 此贴被senfrans在2008-06-17 22:54重新编辑 ]
离线bqlhome
只看该作者 1楼 发表于: 2009-01-08
我用的是Vs2008,QT4.3.3
QT4.4.3是用VC2008编译的,
现在用VS2008写的QT程序只能在本机用,别的机器运行提示重新运行安装程序。晕,
你上面说的文件我全都复制过来了。
就连QT的Demo在别的电脑都用不了,(本机正常)
离线hanxing30

只看该作者 2楼 发表于: 2009-01-08
貌似有一个办法可以解决LS遇到的问题,,

给目标机安装.NET Framework 3.5
离线wd007

只看该作者 3楼 发表于: 2009-01-08
不错,Windows上没用过,学习一下
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线bqlhome
只看该作者 4楼 发表于: 2009-01-09
现在搞定,原来VC2008/2005的C++运行库文件没复制进来。
离线xjcook

只看该作者 5楼 发表于: 2009-01-09
收藏了,下次用到的时候好参考,谢谢楼主
离线zac372424332
只看该作者 6楼 发表于: 2009-11-05
RE
怎么我在Windows下静态编译QT,竟然生成了十几G的文件,晕~硬盘都不够了
离线wd007

只看该作者 7楼 发表于: 2009-11-05
静态编译就是很大的。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
快速回复
限100 字节
 
上一个 下一个