以QT Creator 開發的程式,一般在編譯後都是以動態連結的方式在執行期才與需要的 .dll 做連結,所以如果沒做特別的處理,並無法單獨執行,一定要在開啟 IDE 的狀態執行才可以。如果你試著在輸出目錄執行 exe 檔的話,應該會看到類似下列的錯誤。
QT 佈署工具 windeployqt
本文使用的 QT 版本是 qt-opensource-windows-x86-mingw492-5.6.2.exe,以經內含了程式佈署工具,可以自動的幫使用者把所需要的東西收集在一起。
編譯輸出位置
目前試出的結果是只能對 Release 設置做打包,如果是用 Debug 的話,則會失敗。編譯的設定,可以直接在左下角做修改。
接著,就要找出程式編譯的輸出目錄。在「專案」設定的圖示按一下後,就可以看到目前的檔案輸出目錄了。
看一下輸出目錄下的 Release 目錄,就可以看到編譯出的檔案。
這邊就可以看到 .exe 檔了,但是還不能執行,下一步就是將所需的動態連結檔收集起來。
QT 指令環境
要執行打包程式,可以利用 QT 的指令環境。在搜尋的地方打上 QT,就會列出 “QT 5.6 for Desktop…”,執行該項目就會跳到DOS視窗。
接著將目錄切換到剛的 .exe 位置,再執行 windeployqt . ,就會進行所需檔案收集的的動作。
指令下達後,就可以看到其收集的一下訊息。
再次執行檔案
當收集完檔案後,可以看到編譯輸出的目錄,多了很多檔案。
這時,再執行 .exe 就可以成功執行,不會再提示缺少 .dll 檔案了。
用 enigma virtual box 將程式打包成單一執行檔
目前程式以可以獨立執行,不需要再安裝 QT 的開發環境了。但一堆檔案看起來總是不太舒服,這時我們可以利用 enigma virtual box 這個工將所有的程式打包成一個執行檔,而不是以目錄來儲存所有所需的檔案。這是個免費工具,可以直接下載使用。請到官網 https://enigmaprotector.com/en/downloads.html進行下載安裝。文末有附上我使用的版本,以防連結失效。
安裝完打開程式,先設定幾個部份
- 選定主要要執行的檔案,也就是 QT Build 出來的執行檔
- 打包後要輸出的執行檔位置和名稱,這可以依自己喜好設定
- 按下 「Files Options」,會跳出(4)的對話框,勾選壓縮檔案,這樣會小一點。
接下來按下「Add」選擇 Add Folder Recursive。這時就是要選擇把哪些其它的檔案一起打包,由於剛剛 QT 執行檔所需要的 dll 檔都被與執行檔放在了一起,所以直接選執行檔所在的目錄就可以了。以本文的例子就是 D:\build-qtdep-Desktop_Qt_5_6_2_MinGW_32bit-Release\release ,然後 「Select Folder」對話框選擇用預設值按 ok 即可。
展開檔案樹,看起來的畫面就會像下面這樣。
最後按下 「Process」,就會進行打包壓縮,完成後就會產生出單一的可執行檔案了!
執行檔案
雖然是打包成單一檔案,不過在執行時應該還是偷偷在背景解壓縮。所以第一次啟動會比較慢,第二次速度就會提高了。一個空程式,打包後的大小約是 17MB,雖然有點大,不過使用上沒什麼問題。如果很在意大小,可以試著不要將某些 dll 加入,例如 opengl32sw.dll 這個檔案好像就是不需要的,去除的話檔案可以減少到12MB。
結語
我也不知道為什麼當初會選擇 QT 做為我主要的圖形介面程式語言,應該是其號稱的跨平台功能,的確也可以在 Linux 上安裝 QT 來進行編譯,只不過我自己也沒在 Linux 編過實用的 QT 程式。
另一個好處就是它與嵌入式系統所用的 C 語言同宗,很大部份可以共用 header,這也是在程式開發上的重要優勢。具說 Java 跟 C# 都沒 header 這種東西了,還真不知道怎麼用啊~~~
附件