zoukankan      html  css  js  c++  java
  • 关于在windows下部署发布QT程序的总结

    原文请看:http://www.cnblogs.com/javaexam2/archive/2011/05/18/2632916.html

    关于在windows下部署发布QT程序的总结
    2008-06-01 15:18

    以下包括了部分网上收集的,以及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依赖问题。
  • 相关阅读:
    leetcode 309. Best Time to Buy and Sell Stock with Cooldown
    leetcode 714. Best Time to Buy and Sell Stock with Transaction Fee
    leetcode 32. Longest Valid Parentheses
    leetcode 224. Basic Calculator
    leetcode 540. Single Element in a Sorted Array
    leetcode 109. Convert Sorted List to Binary Search Tree
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 84. Largest Rectangle in Histogram
    leetcode 338. Counting Bits
    git教程之回到过去,版本对比
  • 原文地址:https://www.cnblogs.com/mmix2009/p/3536495.html
Copyright © 2011-2022 走看看