這個問題,其實 Qt 的 manual 中解釋的已經比較清楚了。下面是我根據自己的理解和實驗後寫的東西,希望比Qt文檔容易理解一點。
另外:你可能對 Qt 插件學習(一) 感興趣。如果需要製作安裝程序,請訪問 NSIS學習筆記(以Qt4程序打包爲例)
下面不涉及靜態編譯(靜態編譯可以看看這兒),只包含動態編譯(也就是Qt默認的情況),主要又分 mingw 和 msvc 兩種情況:
Mingw
首先,我們需要生成 release 模式的可執行程序(不少同學抱怨,一個小小程序卻需要100多M的動態庫,就是因爲用的debug)
qmake mingw32-make release
而後將 可執行文件 與 需要的動態庫放到同一個文件夾下,一般需要
- myprogram.exe
- mingwm10.dll
- libgcc_s_dw2-1.dll
- qtcore4.dll
- qtgui4.dll
有同學抱怨,動態庫拷過去以後,程序報錯 無法定位程序輸入點於動態鏈接庫QtCore4.dll上 ,這一般是由於系統中裝了多套Qt的運行庫,而你拷貝的不是Qt安裝目錄下的庫所導致的。比如,當安裝的是Qt SDK時,很容易導致這個問題,因爲裏面的Qt是mingw編譯的,但裏面的QtCreator是msvc編譯的,所以不少人不小心就吧QtCreator帶的Qt運行庫拷過來了。
如果你不需要其他的插件,那麼就可以發佈程序了,然而不少同學抱怨 jpg、gif、bmp 等格式的圖片無法顯示,這是因爲 Qt 原生支持 png,而其他格式需要通過插件支持(插件在 %QTDIR%/plugins\imageformats 目錄下)
你只需將需要的插件拷貝到可執行程序所在的目錄下的 imageformats 目錄下即可
- myprogram.exe
- imageformats\qjpeg4.dll
- imageformats\qgif4.dll
- ...
同樣,如果你的程序需要gb2312、gbk編碼支持,那麼需要將 %QTDIR%\plugins\codecs 目錄下的相應插件拷貝到可執行程序所在目錄下的 codecs 目錄下
- myprogram.exe
- codecs\qcncodecs4.dll
- ...
建議:不妨多看看Qt安裝目錄下的plugins目錄,熟悉這些插件分別是做什麼的,你發佈的程序需要哪些。
現在,程序可以發佈了。你現在也可以通過 nsis 來製作一個安裝包(NSIS學習筆記(以Qt4程序打包爲例))。
msvc
如果用的VS2008 而不是mingw,發佈的過程其實基本是一樣的。
首先生成 release 模式的 可執行文件
qmake nmake release
而後準備需要的動態庫與插件
- myprogram.exe
- qtcore4.dll
- qtgui4.dll
- imageformats\*4.dll
- ...
因爲是vc編譯的,所以不需要mingw的 mingwm10.dll libgcc_s_dw2-1.dll ,取代他們的是VC2008的C\C++ 運行庫:
- MSVCR90.DLL
- MSVCP90.DLL
如果你用的Windows xp 之前的系統,那麼只要將這兩個運行庫和可執行程序放於同一個目錄即可。
但對於Windows xp (包括)之後的系統,這樣做並不會正常工作,程序會報告:由於應用程序配置不正確,應用程序未能啓動。這個問題有點複雜,其實解決方法很簡單,只需在用戶機器上安裝1M多的VS2008可再發行包 vcredist_x86.exe 即可
該包會將運行庫安裝到 window系統目錄下的 WinSxS 目錄下,對xp之前的系統,還會將運行庫同時安裝到path路徑下的目錄內。其實如果用戶裝過其他人編寫的VC2008的程序,機器上很應該已經裝過該包了。
或許你要問,如果不想安裝 可再發行包怎麼辦,比如就想把需要dll一塊和程序打包,我們可以這麼做:
將文件夾 (如果你用的VS2008 express,該文件夾不存在)
<Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC90.CRT
直接複製到可執行程序所在目錄
- myprogram.exe
- Microsoft.VC90.CRT\*
注意:
- 如果用戶機器上已經安裝了可再發行包,程序將永遠不會使用Microsoft.VC90.CRT下的庫。
- 當採用這種方法時,如果同時發佈插件(包括圖片插件等),那麼插件編譯時必須:
CONFIG-=embed_manifest_dll
使得生成的插件中不嵌入manifest文件,否則插件不被程序識別(其實也可以識別,只要將 Microsoft.VC90.CRT 拷貝一份和插件放到同一文件夾即可,當然這種方式很不好,如果插件分佈在幾個目錄下,要放置Microsoft.VC90.CRT的很多副本)。