
(放個目錄友善預覽。這個目錄是從部落格複制過來的,點選會跳轉到部落格)
- 簡介
- 背景
- Qt的安裝
- Qt的目錄結構
- Qt安裝路徑
- Qt核心路徑
- HelloDeploy
- Window編譯和釋出
- Window 編譯
- Window 釋出
- VS運作時庫
- 常見的錯誤處理
- 應用程式無法正常啟動
- 啟動失敗 - no Qt platform plugin
- OpenGL Context 建立失敗
- 整理
- 簡單裁剪
- 删減dll
- 删減plugins
- 删減qml
簡介
本文是《Qt實用技能》系列文章的第六篇,濤哥在這裡讨論釋出Qt應用程式的知識點。
主要是windows平台。
背景
有很多人向濤哥詢問,Qt程式釋出的相關問題,網絡上雖然可以搜到一大堆教程,但是可靠的比較少。
是以這次盡我所能,全面、詳細地整理一些Qt程式釋出的知識點,希望能幫助到更多人。
對老手來說,很多坑都踩過了,無非就是把正确的dll放在正确的路徑。
對新手來說,細節上能多說幾句,都将是莫大的幫助,少走彎路,節省幾個小時、甚至幾天都是有可能的。
如果有疏漏、錯誤,也歡迎大家補充、指正。
Qt的安裝
Qt官網下載下傳位址在這: http://download.qt.io/official_releases
離線安裝包 或者 線上安裝包 都行。
關于Qt版本的選擇,濤哥建議:
體驗新特性,就用最新版本;項目開發,用長期支援版(LTS)的最後一個修正版本,穩定、bug最少。
可以在Qt官方wiki上檢視相關資訊 https://wiki.qt.io/Main
目前為止(2019/9/2),最新版為5.13.0,LTS版本有5.9 和 5.12, 而5.9最後一個修正版本是5.9.8, 5.12則是到5.12.4
例如上圖是5.9.8的離線安裝包,提供了windows、mac以及linux三種系統的可執行程式。
其中windows的安裝程式”qt-opensource-windoiws-x86-5.9.8.exe”, 大小有2.4G,裡面
包含了msvc_x86、msvc_x64、mingw、Android等多個版本的Qt工具鍊。在下載下傳完成,安裝
過程中可以分别勾選。其它版本也是類似的。
如何安裝Qt,就不細說了,搞不定的去參考入門級教程吧…
Qt的目錄結構
這裡假設大家都裝好了Qt,先來了解一下Qt的安裝路徑都有哪些東西。
濤哥用的是Windows 10系統,安裝的Qt版本是5.12.4,以此為例來說明,其它系統和版本以實際為準。
Qt安裝路徑
濤哥安裝在了D:QtOnline 路徑下, 如圖:
其中“vcredist”檔案夾包含了msvc2015 和 msvc2017的運作時庫安裝程式(後面會說怎麼用,不是msvc編譯器不需要)
“Tools”檔案夾,包括QtCreator、OpenSSL庫(可選)以及兩種版本MinGW(可選)。
(圖中還有Qt3DStudio,可忽略)
5.12.4檔案夾,是Qt的核心路徑, 裡面包含多個版本的Qt工具鍊、頭檔案、動态連結庫等
這裡安裝了msvc2017、msvc2017_64、mingw_64以及android_x86.
注意msvc2017和msvc2017_64,帶64的表示x64架構,不帶的是x86。
如果有msvc2013、msvc2015也同理。
Qt核心路徑
接下來看一下重點,Qt的核心路徑, 以msvc2017_64檔案夾為例
bin檔案夾包含了Qt提供的各種工具exe程式,以及動态連結庫的dll
其中工具包括qmake.exe 和 windeployqt.exe,windeployqt.exe是我們今天主要讨論的工具。
動态連結庫全部是兩份dll,比如Qt5Cored.dll和Qt5Core.dll,檔案名末尾帶’d’表示debug版本的,另一個不帶’d’的是release版本。
debug版本和release版本的主要差別:debug沒有開編譯器優化、攜帶了調試資訊,release開了編譯器優化O2,去掉了多餘的資訊
(圖中還有pdb檔案,是濤哥單獨安裝的,用來調試Qt源碼,可以忽略)
和bin同級的,還有plugins檔案夾,包含一些Qt用到的插件
比如imageformats檔案夾中提供了jepg、gif、webp等圖檔格式的功能支援的插件,platforms檔案夾則提供了平台插件,特别是
qwindows.dll這一個,在windows平台是必不可少的。
和bin同級的,另外一個檔案夾是’qml’檔案夾,包含Qml的各種功能子產品。
和bin同級的其它檔案夾,resources是WebEngine子產品專用的,translations提供了
Qt内置的翻譯檔案,剩下的和釋出無關,就不多說了。
HelloDeploy
這裡建立一個簡單的Hello World程式,名字就叫”HelloDeploy”。
同時為了說明問題,濤哥添加一些常用的子產品。
在pro檔案中,QT += 那一行該寫的都寫上:
在main.cpp中包含一下各個子產品的頭檔案,再分别建立一個對象執行個體,調用一些簡單的函數:
這樣一個多子產品依賴的程式就寫好了。
Window編譯和釋出
Window 編譯
這裡要特别注意,編譯器的選擇, 以及編譯用的是debug模式還是release模式。
濤哥這裡是msvc2017_x64版本
一般釋出用release模式。
編譯完成後,預設在build-xxxx-release/release/檔案夾中會生成我們的exe程式。
我們将這個exe複制出來,建立一個release檔案夾,放進去
這時候可以嘗試輕按兩下運作它,會提示缺少dll
Window 釋出
釋出程式,其實就是把exe程式依賴的dll和相關資源都放在一起,保證輕按兩下運作即可。
我們前面提過的windeployqt.exe,是Qt提供的指令行工具,能幫助我們自動把需要的dll或資源複制過來。
- 我們先打開一個指令行
可以從開始菜單找到Qt提供的指令行
注意選對版本。這種指令行在啟動時已經設定好了QT的環境變量,可以直接輸入windeployqt.exe
也可以用普通的指令行,使用windeployqt.exe時帶上絕對路徑即可。
濤哥一般用普通的指令行,因為絕對路徑不易出錯。
- cd到release目錄
這裡說一個windows啟動指令行的小技巧:在release檔案夾中,按住鍵盤shift鍵,然後按滑鼠右鍵,彈出的右鍵菜單,
會比普通的右鍵菜單多一個“在此處打開指令視窗”,點選就能在release檔案夾打開指令行視窗。
如果沒有這個功能,就得手動輸入cd指令,進入release路徑。
- 執行windeployqt指令
這裡通過絕對路徑來使用windeployqt:
d:qtOnline5.12.4msvc2017_64binwindeployqt.exe HelloDeploy.exe
HelloDeploy這個程式還用到了Qml,用到Qml的程式,要給windeployqt加上qmldir參數,寫上你的項目qml檔案所在目錄
(沒用到qml的程式,不要加這一步)
d:qtOnline5.12.4msvc2017_64binwindeployqt.exe HelloDeploy.exe –qmldir .
寫好windeployqt指令後按回車執行
正确執行後,release檔案夾下,多了很多dll,以及一些檔案夾。
這時候我們輕按兩下運作HelloDeploy.exe, 就可以正常啟動了。
将整個檔案夾壓縮或拷貝到其它沒有Qt環境的電腦上,也是可以啟動的。
隻要dll齊備了,制作安裝包也不是問題。(後續有時間,我再寫安裝包制作的教程)
VS運作時庫
如果是VS編譯的程式,需要将QT路徑下對應的vcredist_xxx.exe帶上。
如果其它電腦上有vs運作時則可以直接運作,如果沒有,就需要運作一下vs運作時安裝包。
或者将運作時庫裡面的dll複制出來即可。
一般在VS的安裝路徑,都有展開的dll,可以直接拷貝。
例如,濤哥電腦上的vs2017路徑如下:
按實際的路徑找到這幾個dll,全部拷貝即可。注意x86和x64,别拿錯了。
常見的錯誤處理
一般使用windeployqt,大部分庫都能自動拷貝,不需要手動處理,
隻有極少數情況下,windeployqt跑完,會缺失一些庫,還要手動處理一下。
遇到這種情況,用依賴檢查工具Dependencies即可快速定位問題。
Dependencies下載下傳連結: https://github.com/lucasg/Dependencies
Dependencies 下載下傳好,點選"DependenciesGui.exe"就可以打開界面。注意是名字帶Gui的那個,不帶gui的“Dependencies.exe”是指令行程式。
下面列舉一些常見的錯誤資訊
應用程式無法正常啟動
最容易出現這種錯誤的情況是,程式是64位編譯出來的,而同級目錄下的dll是32位的,
或者同級目錄下沒有dll,但是環境變量中指向了32位的dll。(是以濤哥沒有設定環境變量)
32位和64位倒過來也是。
如果dll版本是比對的,還有可能出現的情況是缺少第三方庫。
這裡說一個檢查依賴的方法:
将HelloDeploy.exe重命名為HelloDeploy.dll,然後用Dependencies打開,就可以檢視少哪些庫
如上圖,紅色問号的表示缺少的庫。
找齊了依賴的庫,再把程式的擴充名改回exe即可。
啟動失敗 - no Qt platform plugin
這種情況,是QT路徑下的 plugins/platforms/qwindows.dll檔案沒有複制過來。
注意這個dll檔案直接複制到exe同級是不起作用的,要放在exe程式同級的platforms檔案夾裡,或者同級
的plugins/platforms檔案夾裡
OpenGL Context 建立失敗
這種情況,一般是OpenGL相關的庫沒有複制過來,補上就好了
整理
我們看到,exe同級目錄下,windeployqt将一堆的檔案夾放在了那裡,有些混亂。
濤哥觀察并驗證了一下,其實可以做個簡單的整理。
Qt開頭的檔案夾都是qml的子產品,剩下的檔案夾除了translations都是Qt的插件,
是以建立兩個檔案夾qml和plugins, 分别把qml子產品和插件歸入其中。
這樣的結構,和QT安裝路徑下的結構是相似的。
這也正是Qt支援的插件加載路徑、qml子產品加載路徑。
同級的dll則是windows系統預設的動态庫加載規則,不友善修改
可以參考msdn:
https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order
簡單裁剪
如果你熟悉Qt的各個子產品,可以進行一些裁剪。以下都是些個人經驗。
不熟悉請慎重!
不熟悉請慎重!
不熟悉請慎重!
(當然靜态編譯也是一種裁剪的途徑)
删減dll
首先可以把單元測試的dll去掉
Qt5Test.dll
Qt5QuickTest.dll
如果沒用到windows擴充,Qt5WinExtras.dll也可以去掉
其次,如果你不需要内置的翻譯檔案,translations檔案夾也可以删掉
删減plugins
再來看一下plugins:
其中platforms是必不可少的,剩下的HelloDeploy都沒用到,可以去掉。
常見程式會用的包括:
imageformats 圖檔格式支援
iconengines 小圖示功能
sqldrivers 資料庫驅動,這個保留用到的資料庫足夠了
其他的看情況删減。
删減qml
最後看一下Qml檔案夾,如果程式完全沒用qml,直接删掉就好了。
按windeployqt給HelloDeploy提供的這些,逐個檔案夾來說:
- Qt/labs 一般不推薦Qml中引入labs中的實驗品,但是有些情況下功能缺失,隻能引入。
如果Qml中使用了Quick.Dialog(不是labs.Dialog),它本身還是依賴的labs中的東西,一般是folderlistmodel和settings,
這時候還是不要動labs了,就按照windeployqt給的放着。
- Qt/WebSockets Qml的Websocket功能,用了就放着,沒用可以删掉。
- QtGraphicalEffects Qml的一些ShaderEffect特效,用了就放着,沒用到可以删掉
- QtMultimedia Qml的多媒體子產品,用了就放着,沒用到可以删掉
- QtQml/Models.2 資料Model, 經常用。
- QtQuick 這裡面大部分都是Qml中常用的,QtQuick/Extras可以按情況删掉
- QtQuick.2 常用的
- QtTest 單元測試,删掉吧
- QtWinExtras Windows擴充,沒用到可以去掉
相關連結
濤哥的部落格:
武威濤哥的部落格jaredtao.github.io
濤哥的部落格-國内鏡像:
https://jaredtao.gitee.iojaredtao.gitee.io
Qt進階之路- 高品質交流 TIM群/QQ群: 734623697