在前面一篇文章中我們講了怎么在CMake里設(shè)置Qt庫的路徑裕照、模塊添加,最后還給了完整的CMake例子调塌。如果不出意外的話晋南,你的CMake + Qt工程應(yīng)該能夠編譯成功了。但如果環(huán)境中找不到依賴庫羔砾,現(xiàn)在還跑不起來负间。這里就涉及到部署操作偶妖。
這其實是個老生常談的問題。Qt Widgets程序就很麻煩唉擂,而Qt Quick程序似乎更麻煩餐屎。我在StackOverFlow上就回答過類似問題:[What must be installed on client machine to run a QT Quick Application?]
手動拷貝依賴庫的問題
我們平時開發(fā)的時候,可以將Qt庫路徑添加到系統(tǒng)Path環(huán)境變量里玩祟,從而讓基于Qt的程序能夠自動加載運行庫腹缩。單這個做法有以下問題:
- 不能用于正式發(fā)布。不能要求普通用戶安裝Qt開發(fā)環(huán)境然后在設(shè)置Path空扎;
- 不能有效區(qū)分多個Qt版本藏鹊。如果電腦上裝了多個Qt版本,那反復(fù)設(shè)置Path是很麻煩的事情转锈。
所以更好的做法是將對應(yīng)的Qt依賴都提取出來盘寡,放在我們的可執(zhí)行程序目錄內(nèi),然后一起打包發(fā)布撮慨。LGPL協(xié)議下使用Qt的話會涉及到大量動態(tài)鏈接庫竿痰,如果是Qt Quick程序,那么還需要帶上很多自帶的QML/Quick模塊砌溺。一種簡單粗暴的方法是先將所有可能用到的庫都拷貝過去影涉,然后逐個嘗試刪除,直到剩下必須的规伐。但很明顯這種方法非常麻煩蟹倾,而且Qt的依賴庫的目錄結(jié)構(gòu)是有講究的,這個很多人常常弄錯猖闪。
有人說可以用Depends等工具查看依賴鲜棠,然后一個個拷貝,但這種方法只能找到C++的類庫培慌,Qt Quick相關(guān)的模塊是查不到的豁陆,因為這些類庫本質(zhì)是通過Qt Plugin機(jī)制加載的,不是嚴(yán)格的運行時依賴检柬。所以這種方法只能針對Qt Widgets程序献联,而且也非常麻煩。
更好的方法是利用Qt自帶的deployqt程序何址。
用deployqt程序自動部署
這個程序在bin目錄中,各個平臺上具體的名字不同进胯,例如在Windows上是windeployqt.exe用爪,在MacOS上是macdeployqt。它是一個命令行程序胁镐,能夠自動分析程序偎血,拷貝必要的依賴庫到我們的可執(zhí)行程序目錄內(nèi)诸衔。
在Windows上用CMD運行windeployqt,可以看到它有很多參數(shù)颇玷。一般的使用方法是:
windeployqt.exe [options] 你的可執(zhí)行程序.exe
最常用的是兩個:
-
--debug
或者--release
笨农,告訴windeployqt你是想部署調(diào)試版依賴庫還是最終發(fā)布版依賴庫; -
--qml
后面加上你的QML文件所在路徑帖渠,windeployqt會自動分析你的QML文件中import
了哪些庫谒亦,然后會自動拷貝到當(dāng)前目錄中。
例如:
windeployqt.exe --debug --qml . demo.exe
假如你的QML文件和demo.exe放在一起空郊,那么上面的命令運行下來你會看到當(dāng)前目錄里添加了很多文件和文件夾份招。
遺留問題
deployqt也不是萬能的。經(jīng)測試狞甚,如果我們的QML文件中用了第三方或者我們自己的模塊锁摔,那這些模塊仍然需要我們手動拷貝到可執(zhí)行程序目錄中。但這些模塊一般不多哼审,所以問題不大谐腰。