现在的位置: 首页 > 综合 > 正文

windows下发布Qt程序

2018年02月13日 ⁄ 综合 ⁄ 共 6373字 ⁄ 字号 评论关闭
From: http://hi.baidu.com/limingfantasy/blog/item/22f6c459b8720086810a182e.html

windows下发布Qt程序

2008-12-19 12:32

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

环境是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+0x1c9):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依赖问题。

(转帖)QT4.3.3+VC6.0安装编译教程

我是从QT中文论坛转来的http://www.qtcn.org/bbs/read.php?tid=9749
QT4.3.3+VC6.0安装编译过程详解
A.    安装前的准备
检查你的QT4.3.3压缩包的位置,并解压。假设解压后的路径为F:\qt433,那么需要先设置环境变量,首先在“我的电脑”—“属性”---“高级 ”---环境变量---**的用户变量-- -新建,添加一个变量名为QTDIR 变量值为F:\qt433(注意:要对应qt解压后的路径),然后继续添加环境变量,变量名为QMAKESPEC,变量值为win32-msvc,在
PATH变量中也应加入F:\qt433\bin.为安装好的qmake所在路径,使得命令行里面可以用qmake。

然后检查vc6.0是否安装好,假设安装后路径为F:\Program Files\Microsoft Visual Studio\……注意:安装时应选择
打开vc6.0检查一下: tools---options---directories,如果正常应该可以看到一下结果:

在目录(directories)里边应该自动添加了这么目录信息,并借检查环境变量里边也已经有了相应的环境变量。
B.    现在进行检查 并安装
打开命令提示符:cmd界面
输入 nmake,检查vc是否安装好

cl 

然后是转到f盘下进入qt433目录执行
congfigure –debug-and-release,(这个作用是编译出 debug版本和release版本的qt的库,更多选项 可以用configure –help)
看到
 
输入 y
Configure完了后输入nmake  开始编译qt,视机器情况大约安装两个小时左右。
成功之后会有如下提示

Please enjoy !
C.    下面进行编译
我们就拿qt中文网上的一个高手的作品为例 作品为图片浏览器  我们把他做好的压缩包压缩到一个路径下 (注意:路径名最好不要有中文) 假设我们解压到F:\jjk\456下
里边已经有了pro文件。
两种编译方法:
第一种:纯命令式
在命令窗口中,转到F:\jjk\456路径下
先qmake(qmake会找 里面的pro文件 就是qt的工程文件)
我们看到qmake之后生成了debug和release目录和makefile、makefile.debug 和makefile.release文件 

图中选中的为qmake之后生成的文件
然后是nmake 

我们可以看到 在debug目录下已经有了很多文件 其中就有可执行文件qtimage.exe 就可以执行了
这就是执行的结果。
 
 

另外一种方法:在vc中编译
首先要用命令行根据pro文件生成vc的工程文件 dsp
F:〉jjk\456\ qmake  –t  vcapp
打开vc6.0
File----open ---从文件类型中选择projects(.dsp)
然后到那个路径下选中 QtImage.dsp 打开 build—rebuild all—build---execute qtimage.exe
THAT’S ALL!!!

我在按照上述教程编译安装的时候,输入nmake进行编译的时候出现了如qtfh1错误提示,我在网上也看到了有不少人有同样或类似的情形,不过就是没有 解决方案。我也想了很多办法,试了很多办法,都以失败告终。最后一气之下将vc卸了重装居然就通过了,具体原因我不清楚,可能由于我的vc是以前安装的缘
故。如果有遇到同类问题,不妨将vc卸了重装试试。


编译成功后,可以用一个简单的QT程序进行测试,新建一个名为hello的文件夹,并新建一个hello.cpp的文件,输入代码
#include <QtGui/QApplication>
#include <QtGui/QWidget>
#include <QtGui/QLabel>
#include <QtCore/QTextCodec>
#include <QtGui/QPushButton>
#include <QtGui/QVBoxLayout>
int main(int argc, char* argv[])
{
        QApplication app(argc, argv);
        QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
        QWidget* pWidget = new QWidget;
        QLabel label(pWidget);
        label.setText(QObject::tr("同一个世界,同一个梦想!"));
        QPushButton* btn = new QPushButton(QObject::tr("关闭"), pWidget);
        QVBoxLayout* layout = new QVBoxLayout;
        layout->addWidget(&label);
        layout->addWidget(btn);
        pWidget->setLayout(layout);
        QObject::connect(btn, SIGNAL(clicked()), pWidget, SLOT(close()));
        pWidget->show();
        return app.exec();
}

然后在命令行下进行编译,并执行。

2) 建立Qt工程
“File” -> "New" -> "New Project"
Qt目录下面选择“Qt Gui Project”, "Next", 然后输入工程名字,剩下的只需要一路取默认值即可。

3) 在窗体上添加按钮
双击工程里面的ui文件,打开窗体编辑窗口.
在菜单"Window" -> "Show View" -> "Other..."
选择"Qt C++ Widget Box",点击"OK",就可以打开控件窗口了,如下图:

以同样方式打开"Qt C++ Signal Slot Editor"窗口.

4) 在窗口上放置两个按钮,在按钮上右键修改objectNametext.
两个的objectName分别是:"Button1","Button2:".
text
分别是:"Show Box", "Close"

5) 添加按钮事件
"Qt C++ Signal Slot Editor"窗口里面,单击"+"图标,这时候再窗口里面出现一行内容.
将双击"",选择“Button2”;双击“”,选择"clicked()";双击"",选择"close()".

打开主窗口类头文件(我的是qqq.h), 添加信号响应部分和函数:
private slots:
    void on_Button1_clicked();

这个函数的格式必须是:on_控件名_事件类型()

cpp文件里面,添加头文件及函数实体:
#include
...
void qqq::on_Button1_clicked()
{
    QMessageBox box(this);
    box.setText("Hello World!");
    box.exec();
}

6) 
Eclipse里面,编译运行程序即可。
效果如下:

注意:
1.
默认的Qt for MinGW的安装,是不安装调试库的,如需运行Debug模式,按照下面的方法编译调试库,
Qtbin目录里面,用命令:
qtvars.bat compile_debug
来编译调试库。
需要大约3G的磁盘空间,大约4个小时的编译时间。

2.如果安装完qt-eclipse-integration-win32-1.0.0.exe,发现第二次启动Eclipse不成功的话,
Eclipseplugins目录下,删除文件“com.trolltech.qtcppstartup_1.0.0.jar”即可。

原帖地址:http://www.cnblogs.com/lansh/archive/2007/11/14/958808.html

附:一些主要工具的网址及当前版本下载地址

Eclipse for C/C++
www.eclipse.org
http://download.actuatechina.com/eclipse/technology/epp/downloads/release/ganymede/SR1/eclipse-cpp-ganymede-SR1-win32.zip

minGW

http://sourceforge.net/projects/mingw/

http://nchc.dl.sourceforge.net/sourceforge/mingw/MinGW-5.1.4.exe

GDB

http://sourceforge.net/projects/mingw/

http://jaist.dl.sourceforge.net/sourceforge/mingw/gdb-6.3-2.exe

QT

http://trolltech.com/

ftp://ftp.trolltech.com/qt/source/qt-win-opensource-4.4.3-mingw.exe

Qt Eclipse Integration for C++

http://dist.trolltech.com/developer/download/qt-eclipse-integration-win32-1.4.3.exe

抱歉!评论已关闭.