电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

QT程序在windows下部署发布


发布日期:2018/8/25
 

QT程序在windows下部署发布

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

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

然后做下面的操作

我的环境是QT + mingwmake

部署发布QT程序有两种方法

第一种静态编译可生成单一的可执行文件

第二种动态编译需同时附上需要的dll文件

静态编译

编译QT

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

configureexe static release

make subsrc

就可以编译出静态库如果只是用来分发程序也可以mingwmake release subsrc只编译一个静态库

这个过程需要个小时QT目录会变成G左右mingwmake和make是一样的

如果用VC平台在编译Qt的时候configureexe static platform winmsvc

然后nmake subsrc或者nmake release subsrc完成静态编译

编译程序

然后到你自己的程序目录下执行

make clean

qmake config release

make

这时会得到一个非常大的可执行程序但也会有一个重要的问题就是图片文件显示不出来

按照QT帮助的说法QT里的jpeggif等图片的支持都是以插件的形式存在的现在我们还没有包含任何插件

加入插件

在maincpp里

#include <QApplication>

#include <QtPlugin> //这个

Q_IMPORT_PLUGIN(qjpeg) //这个

Q_IMPORT_PLUGIN(qgif) //这个

int main(int argc char *argv[])

{

QApplication app(argc argv)

return appexec()

}

pro里加入

QTPLUGIN += qjpeg qgif

CONFIG += static

QT的帮助里就做到这里但我编译程序时出错如下

release/maino(text+×cmaincpp:

undefined reference to `qt_plugin_instance_qgif()

undefined reference to `qt_plugin_instance_qjpeg()

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

加入LIBS

pro中加入

LIBS += C:/Qt//plugins/imageformats/libqgifa

LIBS += C:/Qt//plugins/imageformats/libqjpega

如果QT静态编译正确的话你应该上面这个目录下看到这两个文件libqgifa和libqjpega (据说以前的QT版本也可能是lib或o文件)

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

解决MinGW的mingwmdll依赖问题

在Makefilerelease里找到

LFLAGS = enablestdcallfixup Wlenableautoimport Wlenableruntimepseudoreloc static Wls Wl mthreads Wl subsystemwindows

删除其中的mthreads

quote:

一般只有用到 threads的时候才用到mingwmdll我们通常遇到的缺少mingwmdll问题可以在程序qmake生成 makefilerelease文件后删除mthreads参数即可一般在 LFLAGS后面当然这只是临时解决方案每次都要手动修改也可以在编译QT前先修改qmakeh不过不推荐这种方法其实 mingwmdll也就十多K每次发布程序时一起打包也无所谓

这时编译同样得到一个非常大的可执行程序(我写的这个贪吃蛇一共多行生成的exe有M)用AspPack压缩一下就可以发给用户了(这时是M)

quote: 这样编译出来的程序比较大可以先用strip命令去掉程序里面一些无用信息后用ASPack或者UPX之类的压缩加壳软件压缩一下两者的压缩率基本都达到%多一点压缩效果还是很明显的

动态编译

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

MINGWM DLL

QTGUIDLL

QTCOREDLL

VC编译程序运行时需要的几个dll文件

MicrosoftVCCRTmanifest 位于x:\Program Files\Microsoft Visual Studio \VC\redist\x\\MicrosoftVCCRT

msvcmdll

msvcpdll

msvcrdll

QtCoredll

QtGuidll

这样就可以运行了但图片文件还是可能显示不出来解决办法

把程序文件夹里建立一个imageformats目录(必须是这个名字)把qt目录下的plugin/imageformats目录下对应的dll文件copy过去这样动态连接就完成了

发布中文Qt程序时要注意的问题

【本站开通在线QQ讨论群】

用Qt写好了程序并撰写了中文的语言文件(qm文件) 后发布到没有安装过Qt的系统上时却发现只有固定的界面文字中的中文能正常显示而程序运行过程中保存到诸如txtxml文件中的中文却变成了奇怪的编码而读回时就会变成

经 过研读Qt的文档总算知道了原因那是因为对于中文之类的特殊编码文字Qt系统中是使用相应的TextCodec来进行Unicode到本地编码 (GBGB等)的转换的而这个TextCodec并不是静态编译到Qt的几个库文件中的而是在编译完Qt系统后以Plugin 的形式出现在 /qt/plugins/codecs 目录下如简体中文的Codec库文件名为qcncodecsdll而我发布Qt程序时只安装了Qt的几个主文件 (QtCoredllQtGuidll)所以造成了该系统上缺少中文Codec的问题

解决方法很简单有多种方法

)将以上的中文编码库文件安装到可执行程序的目录下的 codecs 目录下程序启动时QtCore中的初始化过程会自动找到该目录并加载到内存中

)在Qt程序启动时用代码指定Qt的Library搜索路径

)编写nfig文件放在可执行文件的目录下并在其中定义Codecs的路径

)对于用static编译的Qt在主程序文件中写上这句宏指令Q_IMPORT_PLUGIN(qcncodecs)并在Link中加入相应的LIB文件

具体内容我不多说了看Qt文档吧 doc/html/l

另外Qt的图像解码系统也是用Plugin的方式提供的如果忘了复制如jpeggif之类的解码库的话程序将只能显示bmp和png的图片了

上一篇:Windows2000Beta3常见问题释疑

下一篇:让Win XP“登录”与“计划”不再沖突