在Windows下部署QT程式的總結

來源:互聯網
上載者:User
Table of Contents
  • 引用說明:
  • 部署發布QT程式有兩種方法
  • 一、靜態編譯
    • 1 編譯QT。
    • 2 編譯器。
    • 3 加入外掛程式
    • 4 加入LIBS
    • 5 解決MinGW的mingwm10.dll依賴問題
  • 二、動態編譯
引用說明:

本文原址連結: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依賴問題。

Author: Le Cao

Date: 2010-10-12 18:02:28 CST

HTML generated by org-mode TAG=7.01g in emacs 23

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.