24小时热门版块排行榜    

Znn3bq.jpeg
查看: 1348  |  回复: 4

yalefield

金虫 (文坛精英)

老汉一枚

[交流] 【转帖】如何发布在Windows下开发的QT程序 已有3人参与

老汉按:程序编好了,换一台机器就不能执行。问题就在于程序还需要库文件的支持。

http://hi.baidu.com/jzinfo/blog/item/c17c3f6d4ff439fe431694c3.html

发布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里:
CODE:
#include
#include //这个

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里找到:
CODE:
LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -static -Wl,-s -Wl -mthreads -Wl, -subsystem,windows

删除其中的”-mthreads”

一般只有用到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)。

这样编译出来的程序比较大,可以先用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依赖问题。


[ Last edited by yalefield on 2011-1-31 at 13:25 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhouyadan2

银虫 (小有名气)

真是累啊!
2楼2011-03-21 16:02:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)


小木虫(金币+0.5):给个红包,谢谢回帖交流
我觉得发布Qt程序,还是用静态编译比较好。Win平台上很少有Qt库的。而Qt那一堆动态库太大了。
3楼2011-03-22 09:34:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yalefield

金虫 (文坛精英)

老汉一枚

引用回帖:
Originally posted by holmescn at 2011-03-22 09:34:15:
我觉得发布Qt程序,还是用静态编译比较好。Win平台上很少有Qt库的。而Qt那一堆动态库太大了。

这要看具体情况。
如果您开发了一个套件,有48个可执行程序;
而每个执行程序都采用静态编译的话,
那整个套件就会膨胀很多咯。
4楼2011-03-22 11:14:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)


小木虫(金币+0.5):给个红包,谢谢回帖交流
我主要开发的都是单个的小程序啊。哈哈。
不过现在都Ajax了,单机程序越来越不吃香了……
5楼2011-03-22 18:43:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 yalefield 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 一志愿安大生物学07初试322、本科二本、调剂求助 +10 李多米lee. 2026-04-12 11/550 2026-04-12 22:58 by yuyin1233
[考研] 求调剂,985材料与化工348分 +9 涵竹刘 2026-04-11 13/650 2026-04-12 22:40 by 涵竹刘
[考研] 化学工程调剂289 +44 yang婷 2026-04-07 50/2500 2026-04-12 02:36 by 秋豆菜芽
[考研] 一志愿郑州大学 22408 305分求调剂 +5 安小满zzz 2026-04-08 5/250 2026-04-12 00:41 by 蓝云思雨
[考研] 求调剂 +18 MAX怅惘 2026-04-09 20/1000 2026-04-11 23:31 by zhen~
[考研] 调剂 +6 青灯不负 2026-04-09 6/300 2026-04-11 20:35 by dongdian1
[考研] 085404 293求调剂 +9 勇远库爱314 2026-04-06 10/500 2026-04-11 10:36 by 紫曦紫棋
[考研] 284求调剂 +12 archer.. 2026-04-10 13/650 2026-04-11 08:44 by zhq0425
[考研] 材料复试求调剂 +20 xhhdjdjsjks 2026-04-09 20/1000 2026-04-10 10:25 by 孙小小12457
[考研] 生物学调剂,一志愿西南大学348,Top期刊一区二作、二区三作,三等奖学金三次 +4 candyyyi 2026-04-09 4/200 2026-04-09 18:39 by l_paradox
[考研] 复试调剂,一志愿郑州大学材料与化工289分 +31 硕星赴 2026-04-08 31/1550 2026-04-09 16:54 by Delta2012
[考研] 086000生物与医药调剂 +7 awwwwwooooo 2026-04-09 7/350 2026-04-09 13:31 by 北极159263
[考研] 一志愿0807 数一英一 313 有没有二轮调剂 +11 emokidd 2026-04-08 12/600 2026-04-09 09:24 by wyf236
[考研] 材料科学与工程320求调剂,080500 +12 黄瓜味薯片 2026-04-06 12/600 2026-04-08 16:26 by luoyongfeng
[考研] 机械工程264学硕求调剂 +3 qiushangxian 2026-04-06 3/150 2026-04-08 01:53 by Linzejun
[考研] 313求调剂 +3 十六拾陆 2026-04-07 3/150 2026-04-07 23:20 by lbsjt
[考研] 344求调剂 +11 魏子per 2026-04-07 11/550 2026-04-07 23:01 by JourneyLucky
[考研] 307求调剂 +3 Youth@@ 2026-04-07 3/150 2026-04-07 22:00 by hemengdong
[考研] 本科生物信息学,总分362 求07 08调剂 +6 q小倩1210 2026-04-06 6/300 2026-04-07 19:40 by macy2011
[考研] 372分材料与化工(085600)英二数二求调剂 +4 蓝笺片 2026-04-06 4/200 2026-04-07 12:30 by dongzh2009
信息提示
请填处理意见