QT程式在windows下部署釋出
以下包括了部分網上收集的,以及qt幫助裡的內容(Deploying an Application on Qt/Windows)
首先,開啟windows控制檯,然後,找到vs安裝目錄下的bin裡,執行 vcvars32.bat 這個指令碼。執行完之後,vs需要的所有環境變數就已經設定好了。
然後,做下面的操作:
我的環境是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+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,每次釋出程式時一起打包也無所謂。
這時編譯同樣得到一個非常大的可執行程式(我寫的這個貪吃蛇一共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過去。這樣動態連線就完成了。
釋出中文Qt程式時要注意的問題:
【本站開通線上QQ討論群】
用Qt寫好了程式,並撰寫了中文的語言檔案(.qm檔案) 後,釋出到沒有安裝過Qt的系統上時,卻發現只有固定的介面文字中的中文能正常顯示,而程式執行過程中儲存到諸如txt、xml檔案中的中文卻變成了奇怪的編碼,而讀回時就會變成“?”。
經過研讀Qt的文件,總算知道了原因,那是因為對於中文之類的特殊編碼文字,Qt系統中是使用相應的TextCodec來進行Unicode到本地編碼(GB2312,GB18030等)的轉換的,而這個TextCodec並不是靜態編譯到Qt的幾個庫檔案中的,而是在編譯完Qt系統後,以Plugin的形式出現在 /qt/plugins/codecs 目錄下,如簡體中文的Codec庫檔名為:qcncodecs4.dll,而我釋出Qt程式時只安裝了Qt的幾個主檔案(QtCore4.dll,QtGui4.dll),所以造成了該系統上缺少中文Codec的問題。
解決方法很簡單,有多種方法:
1)將以上的中文編碼庫檔案安裝到可執行程式的目錄下的 codecs 目錄下,程式啟動時,QtCore中的初始化過程會自動找到該目錄並載入到記憶體中。
2)在Qt程式啟動時,用程式碼指定Qt的Library搜尋路徑。
3)編寫qt.config檔案,放在可執行檔案的目錄下,並在其中定義Codecs的路徑。
4)對於用static編譯的Qt,在主程式檔案中寫上這句巨集指令:Q_IMPORT_PLUGIN(qcncodecs),並在Link中加入相應的LIB檔案。
具體內容我不多說了,看Qt文件吧: doc/html/plugins-howto.html
另外,Qt的影像解碼系統也是用Plugin的方式提供的,如果忘了複製如jpeg,gif之類的解碼庫的話,程式將只能顯示bmp和png的圖片了。