解析 Qt 程序在Windows 下發(fā)布
Qt 程序在Windows 下發(fā)布是本文要介紹的內(nèi)容,不多說(shuō)了,先來(lái)看內(nèi)容,針對(duì)這個(gè)問(wèn)題,其實(shí) Qt 的 manual 中解釋的已經(jīng)比較清楚了。下面是我根據(jù)自己的理解和實(shí)驗(yàn)后寫的東西,希望比Qt文檔容易理解一點(diǎn)。
下面不涉及靜態(tài)編譯(靜態(tài)編譯可以看看這兒),只包含動(dòng)態(tài)編譯(也就是Qt默認(rèn)的情況),主要又分 mingw 和 msvc 兩種情況:
- Mingw
首先,我們需要生成 release 模式的可執(zhí)行程序(不少同學(xué)抱怨,一個(gè)小小程序卻需要100多M的動(dòng)態(tài)庫(kù),就是因?yàn)橛玫膁ebug)
- qmake
- mingw32-make release
而后將 可執(zhí)行文件 與 需要的動(dòng)態(tài)庫(kù)放到同一個(gè)文件夾下,一般需要
- myprogram.exe
- mingwm10.dll
- libgcc_s_dw2-1.dll
- qtcore4.dll
- qtgui4.dll
有同學(xué)抱怨,動(dòng)態(tài)庫(kù)拷過(guò)去以后,程序報(bào)錯(cuò) 無(wú)法定位程序輸入點(diǎn)于動(dòng)態(tài)鏈接庫(kù)QtCore4.dll上 ,這一般是由于系統(tǒng)中裝了多套Qt的運(yùn)行庫(kù),而你拷貝的不是Qt安裝目錄下的庫(kù)所導(dǎo)致的。比如,當(dāng)安裝的是Qt SDK時(shí),很容易導(dǎo)致這個(gè)問(wèn)題,因?yàn)槔锩娴腝t是mingw編譯的,但里面的QtCreator是msvc編譯的,所以不少人不小心就吧QtCreator帶的Qt運(yùn)行庫(kù)拷過(guò)來(lái)了。
如果你不需要其他的插件,那么就可以發(fā)布程序了,然而不少同學(xué)抱怨 jpg、gif、bmp 等格式的圖片無(wú)法顯示,這是因?yàn)?Qt 原生支持 png,而其他格式需要通過(guò)插件支持(插件在 %QTDIR%/plugins\imageformats 目錄下)
你只需將需要的插件拷貝到可執(zhí)行程序所在的目錄下的 imageformats 目錄下即可
- myprogram.exe
- imageformats\qjpeg4.dll
- imageformats\qgif4.dll
同樣,如果你的程序需要gb2312、gbk編碼支持,那么需要將 %QTDIR%\plugins\codecs 目錄下的相應(yīng)插件拷貝到可執(zhí)行程序所在目錄下的 codecs 目錄下
- myprogram.exe
- codecs\qcncodecs4.dll
建議:不妨多看看Qt安裝目錄下的plugins目錄,熟悉這些插件分別是做什么的,你發(fā)布的程序需要哪些。
現(xiàn)在,程序可以發(fā)布了。你現(xiàn)在也可以通過(guò) nsis 來(lái)制作一個(gè)安裝包。
- msvc
如果用的VS2008 而不是mingw,發(fā)布的過(guò)程其實(shí)基本是一樣的。
首先生成 release 模式的 可執(zhí)行文件
- qmake
- nmake release
而后準(zhǔn)備需要的動(dòng)態(tài)庫(kù)與插件
- myprogram.exe
- qtcore4.dll
- qtgui4.dll
- imageformats\*4.dll
因?yàn)槭莢c編譯的,所以不需要mingw的 mingwm10.dll libgcc_s_dw2-1.dll ,取代他們的是VC2008的C\C++ 運(yùn)行庫(kù):
- MSVCR90.DLL
- MSVCP90.DLL
如果你用的Windows xp 之前的系統(tǒng),那么只要將這兩個(gè)運(yùn)行庫(kù)和可執(zhí)行程序放于同一個(gè)目錄即可。
但對(duì)于Windows xp (包括)之后的系統(tǒng),這樣做并不會(huì)正常工作,程序會(huì)報(bào)告:由于應(yīng)用程序配置不正確,應(yīng)用程序未能啟動(dòng)。這個(gè)問(wèn)題有點(diǎn)復(fù)雜,其實(shí)解決方法很簡(jiǎn)單,只需在用戶機(jī)器上安裝1M多的VS2008可再發(fā)行包 vcredist_x86.exe 即可
該包會(huì)將運(yùn)行庫(kù)安裝到 window系統(tǒng)目錄下的 WinSxS 目錄下,對(duì)xp之前的系統(tǒng),還會(huì)將運(yùn)行庫(kù)同時(shí)安裝到path路徑下的目錄內(nèi)。其實(shí)如果用戶裝過(guò)其他人編寫的VC2008的程序,機(jī)器上很應(yīng)該已經(jīng)裝過(guò)該包了。
或許你要問(wèn),如果不想安裝 可再發(fā)行包怎么辦,比如就想把需要dll一塊和程序打包,我們可以這么做:
將文件夾 (如果你用的VS2008 express,該文件夾不存在)
- <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC90.CRT
直接復(fù)制到可執(zhí)行程序所在目錄
- myprogram.exe
- Microsoft.VC90.CRT\*
注意:
(1)如果用戶機(jī)器上已經(jīng)安裝了可再發(fā)行包,程序?qū)⒂肋h(yuǎn)不會(huì)使用Microsoft.VC90.CRT下的庫(kù)。
(2)當(dāng)采用這種方法時(shí),如果同時(shí)發(fā)布插件(包括圖片插件等),那么插件編譯時(shí)必須:
- CONFIG-=embed_manifest_dll
使得生成的插件中不嵌入manifest文件,否則插件不被程序識(shí)別(其實(shí)也可以識(shí)別,只要將 Microsoft.VC90.CRT 拷貝一份和插件放到同一文件夾即可,當(dāng)然這種方式很不好,如果插件分布在幾個(gè)目錄下,要放置Microsoft.VC90.CRT的很多副本)。
工具
1. 一定要記住: Dependency Walker 是你的好幫手,它會(huì)告訴你你的 exe 和 dll需要哪些庫(kù),以及它加載的動(dòng)態(tài)庫(kù)都在哪個(gè)文件夾內(nèi) 等
2. 最好準(zhǔn)備一個(gè)進(jìn)程查看的工具,比如微軟的 Process Explorer等,來(lái)查看你的程序到底加載了哪些動(dòng)態(tài)庫(kù)(加載了哪些插件等)
小結(jié):關(guān)于解析 Qt 程序在Windows 下發(fā)布的內(nèi)容介紹完了,希望本文對(duì)你有所幫助。