Qt 程式在 windows 下的發布

來源:互聯網
上載者:User

 

2010-05-22 0:53

這個問題,其實 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的很多副本)。

工具

1. 一定要記住: Dependency Walker 是你的好幫手,它會告訴你你的 exe 和 dll需要哪些庫,以及它載入的動態庫都在哪個檔案夾內 等

2. 最好準備一個進程查看的工具,比如微軟的 Process Explorer等,來查看你的程式到底載入了哪些動態庫(載入了哪些外掛程式等)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.