windeployqt.exe的使用与避坑(windows平台)
介紹
windeployqt.exe是Qt自帶的工具,用于創建應用程序發布包。
簡單來說,這個工具可以自動地將某程序依賴的庫、資源拷貝到其所在目錄,防止程序在其他電腦上運行報找不到庫的錯誤。
這里貼上官方文檔:https://doc.qt.io/qt-5/windows-deployment.html
原理
windeployqt.exe工作原理很簡單,它會到當前的環境變量PATH配置的搜索路徑中,查找應用程序所需要的庫和資源,拷貝到應用程序目錄中。
使用
1、先從開始菜單中打開對應版本的Qt命令行終端界面,如下圖:
2、命令行中輸入
我們知道,Qt項目路徑不能包含中文,所以為了保險起見,應用程序路徑中不要包含中文。另外,如果應用程序路徑中包含空格,需要用雙引號將整個路徑字符串包裹起來。
回車即可執行發布命令。輸出界面如下圖所示:
進入到應用程序目錄可以看到,目錄中增加了很多依賴庫和數據文件。如下圖所示:
大體上的流程只有這兩步。
整個發布過程看似比較簡單,但是其中還是存在一些坑的。
坑點一:未使用Qt的命令行終端執行發布命令,導致庫版本拷貝錯誤
下面是直接使用系統cmd命令行發布軟件的過程:
直接打開cmd命令行,進入到windeployqt.exe所在目錄
輸入:windeployqt.exe 應用程序完整路徑,回車。
這樣發布出來的應用程序可能會崩潰或者出現以下問題:
面對這個錯誤沒有經驗的話,很難解決,特別是軟件直接崩潰的話,更無從下手。要解決這個問題,估計至少要半天時間。
0xc000007b是一個經典錯誤,它代表著程序啟動時使用了不正確的版本的庫,導致無法正常運行。例如,64位的軟件使用了32位的庫。
所以,發生上面錯誤的原因是,windeployqt.exe從系統的環境變量路徑PATH中找到了其他版本的依賴庫,而這個依賴庫并不是我們的應用程序真正依賴的那個版本。當你的計算機中安裝了很多軟件,某些軟件會添加系統環境變量,指向自己的bin目錄;抑或是安裝了幾個版本的Qt開發環境時,難免會導致搜索路徑中有同名稱的、不同版本的庫存在,這些情況下,庫版本錯亂的問題經常發生。
在Qt命令行中輸入 echo %PATH%,可以查看當前Qt使用的環境變量:
上圖中紅色框內是此版本Qt的庫文件目錄,已添加到當前PATH環境變量的最開頭,將會被windeployqt.exe優先搜索到。如此一來,Qt相關的庫便不會產生庫版本錯誤的問題。
坑點二:未使用與Qt版本對應的windeployqt.exe
發布軟件時,必須確定項目開發所使用的Qt版本,并使用此版本Qt安裝目錄下的windeployqt.exe完成發布過程。每個Qt版本中的工具只有在此Qt版本下才能確保正常工作,混用會引入未知的風險。
坑點三:發布時,默認文件不會覆蓋
在Qt命令行終端中多次執行發布命令時,已發布到應用程序文件夾中的文件默認不會被覆蓋。當你第一次發布出問題時,調整好環境后再次發布并不會覆蓋已存在的文件。這可能和我們期望的不太一樣。可以通過添加強制覆蓋參數–force強制覆蓋已存在的文件,如下圖所示:
建議始終添加–force參數,防止因文件未覆蓋而出現問題。
細節問題
Qt命令行啟動時有一行提示:
上面打包輸出界面的紅框中,有這樣一行警告:
Warning: Cannot find Visual Studio installation directory, VCINSTALLDIR is not set.
意思是說,因為我們沒有運行vcvarsall.bat,所以VS的環境變量沒有配置好,所以不會拷貝VS相關的依賴庫。
vcvarsall.bat是VS的自帶的配置環境變量的批處理文件。以VS2010為例,它位于路徑 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC 下。它屬于VS命令行工具的一部分,這里不多說,直接去看VS官網文檔即可:通過命令行使用 Microsoft C++ 工具集。
那我們就嘗試運行vcvarsall.bat來配置一下VS的環境。整個過程的完整操作過程界面如下:
可以看到,那一行警告不見了。同時,應用程序目錄下多了兩個庫文件,如下圖:
這樣發布出來的目錄就帶上了VS的依賴庫,拷貝到沒有安裝VS的電腦上亦可以運行。
命令幫助
除本文提及的基本參數,發布程序還提供了一些額外參數選項,可以通過查看命令幫助了解。
在Qt命令行終端中輸入
windeployqt.exe -h可以查看命令幫助,如下圖所示:
限于篇幅,這里不再進一步講解,大家可以自己動手嘗試。
結語
總體來說,雖然發布步驟比較簡單,但是有坑有細節,自己嘗試操作幾次就能熟悉了。里面的坑筆者踩過,會浪費很多時間,希望大家能避免踩坑,提高效率。
本文原創首發于公眾號/頭條號 Qt未來工程師。
總結
以上是生活随笔為你收集整理的windeployqt.exe的使用与避坑(windows平台)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浦发库支票信用卡怎么用最划算
- 下一篇: Windows高级编程学习笔记(三)