天天看點

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南
目錄

(放個目錄友善預覽。這個目錄是從部落格複制過來的,點選會跳轉到部落格)

  • 簡介
  • 背景
  • 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

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

例如上圖是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 路徑下, 如圖:

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

其中“vcredist”檔案夾包含了msvc2015 和 msvc2017的運作時庫安裝程式(後面會說怎麼用,不是msvc編譯器不需要)

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

“Tools”檔案夾,包括QtCreator、OpenSSL庫(可選)以及兩種版本MinGW(可選)。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

(圖中還有Qt3DStudio,可忽略)

5.12.4檔案夾,是Qt的核心路徑, 裡面包含多個版本的Qt工具鍊、頭檔案、動态連結庫等

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

這裡安裝了msvc2017、msvc2017_64、mingw_64以及android_x86.

注意msvc2017和msvc2017_64,帶64的表示x64架構,不帶的是x86。

如果有msvc2013、msvc2015也同理。

Qt核心路徑

接下來看一下重點,Qt的核心路徑, 以msvc2017_64檔案夾為例

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

bin檔案夾包含了Qt提供的各種工具exe程式,以及動态連結庫的dll

其中工具包括qmake.exe 和 windeployqt.exe,windeployqt.exe是我們今天主要讨論的工具。

動态連結庫全部是兩份dll,比如Qt5Cored.dll和Qt5Core.dll,檔案名末尾帶’d’表示debug版本的,另一個不帶’d’的是release版本。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

debug版本和release版本的主要差別:debug沒有開編譯器優化、攜帶了調試資訊,release開了編譯器優化O2,去掉了多餘的資訊

(圖中還有pdb檔案,是濤哥單獨安裝的,用來調試Qt源碼,可以忽略)

和bin同級的,還有plugins檔案夾,包含一些Qt用到的插件

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

比如imageformats檔案夾中提供了jepg、gif、webp等圖檔格式的功能支援的插件,platforms檔案夾則提供了平台插件,特别是

qwindows.dll這一個,在windows平台是必不可少的。

和bin同級的,另外一個檔案夾是’qml’檔案夾,包含Qml的各種功能子產品。

和bin同級的其它檔案夾,resources是WebEngine子產品專用的,translations提供了

Qt内置的翻譯檔案,剩下的和釋出無關,就不多說了。

HelloDeploy

這裡建立一個簡單的Hello World程式,名字就叫”HelloDeploy”。

同時為了說明問題,濤哥添加一些常用的子產品。

在pro檔案中,QT += 那一行該寫的都寫上:

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

在main.cpp中包含一下各個子產品的頭檔案,再分别建立一個對象執行個體,調用一些簡單的函數:

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

這樣一個多子產品依賴的程式就寫好了。

Window編譯和釋出

Window 編譯

這裡要特别注意,編譯器的選擇, 以及編譯用的是debug模式還是release模式。

濤哥這裡是msvc2017_x64版本

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

一般釋出用release模式。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

編譯完成後,預設在build-xxxx-release/release/檔案夾中會生成我們的exe程式。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南
vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

我們将這個exe複制出來,建立一個release檔案夾,放進去

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

這時候可以嘗試輕按兩下運作它,會提示缺少dll

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

Window 釋出

釋出程式,其實就是把exe程式依賴的dll和相關資源都放在一起,保證輕按兩下運作即可。

我們前面提過的windeployqt.exe,是Qt提供的指令行工具,能幫助我們自動把需要的dll或資源複制過來。

  1. 我們先打開一個指令行

可以從開始菜單找到Qt提供的指令行

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

注意選對版本。這種指令行在啟動時已經設定好了QT的環境變量,可以直接輸入windeployqt.exe

也可以用普通的指令行,使用windeployqt.exe時帶上絕對路徑即可。

濤哥一般用普通的指令行,因為絕對路徑不易出錯。

  1. cd到release目錄

這裡說一個windows啟動指令行的小技巧:在release檔案夾中,按住鍵盤shift鍵,然後按滑鼠右鍵,彈出的右鍵菜單,

會比普通的右鍵菜單多一個“在此處打開指令視窗”,點選就能在release檔案夾打開指令行視窗。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

如果沒有這個功能,就得手動輸入cd指令,進入release路徑。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南
  1. 執行windeployqt指令

這裡通過絕對路徑來使用windeployqt:

d:qtOnline5.12.4msvc2017_64binwindeployqt.exe HelloDeploy.exe

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

HelloDeploy這個程式還用到了Qml,用到Qml的程式,要給windeployqt加上qmldir參數,寫上你的項目qml檔案所在目錄

(沒用到qml的程式,不要加這一步)

d:qtOnline5.12.4msvc2017_64binwindeployqt.exe HelloDeploy.exe –qmldir .

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

寫好windeployqt指令後按回車執行

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

正确執行後,release檔案夾下,多了很多dll,以及一些檔案夾。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

這時候我們輕按兩下運作HelloDeploy.exe, 就可以正常啟動了。

将整個檔案夾壓縮或拷貝到其它沒有Qt環境的電腦上,也是可以啟動的。

隻要dll齊備了,制作安裝包也不是問題。(後續有時間,我再寫安裝包制作的教程)

VS運作時庫

如果是VS編譯的程式,需要将QT路徑下對應的vcredist_xxx.exe帶上。

如果其它電腦上有vs運作時則可以直接運作,如果沒有,就需要運作一下vs運作時安裝包。

或者将運作時庫裡面的dll複制出來即可。

一般在VS的安裝路徑,都有展開的dll,可以直接拷貝。

例如,濤哥電腦上的vs2017路徑如下:

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

按實際的路徑找到這幾個dll,全部拷貝即可。注意x86和x64,别拿錯了。

常見的錯誤處理

一般使用windeployqt,大部分庫都能自動拷貝,不需要手動處理,

隻有極少數情況下,windeployqt跑完,會缺失一些庫,還要手動處理一下。

遇到這種情況,用依賴檢查工具Dependencies即可快速定位問題。

Dependencies下載下傳連結: https://github.com/lucasg/Dependencies

Dependencies 下載下傳好,點選"DependenciesGui.exe"就可以打開界面。注意是名字帶Gui的那個,不帶gui的“Dependencies.exe”是指令行程式。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

下面列舉一些常見的錯誤資訊

應用程式無法正常啟動

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

最容易出現這種錯誤的情況是,程式是64位編譯出來的,而同級目錄下的dll是32位的,

或者同級目錄下沒有dll,但是環境變量中指向了32位的dll。(是以濤哥沒有設定環境變量)

32位和64位倒過來也是。

如果dll版本是比對的,還有可能出現的情況是缺少第三方庫。

這裡說一個檢查依賴的方法:

将HelloDeploy.exe重命名為HelloDeploy.dll,然後用Dependencies打開,就可以檢視少哪些庫

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

如上圖,紅色問号的表示缺少的庫。

找齊了依賴的庫,再把程式的擴充名改回exe即可。

啟動失敗 - no Qt platform plugin

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

這種情況,是QT路徑下的 plugins/platforms/qwindows.dll檔案沒有複制過來。

注意這個dll檔案直接複制到exe同級是不起作用的,要放在exe程式同級的platforms檔案夾裡,或者同級

的plugins/platforms檔案夾裡

OpenGL Context 建立失敗

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

這種情況,一般是OpenGL相關的庫沒有複制過來,補上就好了

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

整理

我們看到,exe同級目錄下,windeployqt将一堆的檔案夾放在了那裡,有些混亂。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

濤哥觀察并驗證了一下,其實可以做個簡單的整理。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

Qt開頭的檔案夾都是qml的子產品,剩下的檔案夾除了translations都是Qt的插件,

是以建立兩個檔案夾qml和plugins, 分别把qml子產品和插件歸入其中。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

這樣的結構,和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檔案夾也可以删掉

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

删減plugins

再來看一下plugins:

其中platforms是必不可少的,剩下的HelloDeploy都沒用到,可以去掉。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

常見程式會用的包括:

imageformats 圖檔格式支援

iconengines 小圖示功能

sqldrivers 資料庫驅動,這個保留用到的資料庫足夠了

其他的看情況删減。

删減qml

最後看一下Qml檔案夾,如果程式完全沒用qml,直接删掉就好了。

vs2017怎麼寫第二個程式_Qt實用技能6-程式釋出指南

按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.io​jaredtao.gitee.io

Qt進階之路- 高品質交流 TIM群/QQ群: 734623697