Qt Quick程序的部署方法

在前面一篇文章中我們講了怎么在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的程序能夠自動加載運行庫腹缩。單這個做法有以下問題:

  1. 不能用于正式發(fā)布。不能要求普通用戶安裝Qt開發(fā)環(huán)境然后在設(shè)置Path空扎;
  2. 不能有效區(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í)行程序目錄中。但這些模塊一般不多哼审,所以問題不大谐腰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市涩盾,隨后出現(xiàn)的幾起案子十气,更是在濱河造成了極大的恐慌,老刑警劉巖旁赊,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桦踊,死亡現(xiàn)場離奇詭異,居然都是意外死亡终畅,警方通過查閱死者的電腦和手機(jī)籍胯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來离福,“玉大人杖狼,你說我怎么就攤上這事⊙” “怎么了蝶涩?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長絮识。 經(jīng)常有香客問我绿聘,道長,這世上最難降的妖魔是什么次舌? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任熄攘,我火速辦了婚禮,結(jié)果婚禮上彼念,老公的妹妹穿的比我還像新娘挪圾。我一直安慰自己浅萧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布哲思。 她就那樣靜靜地躺著洼畅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棚赔。 梳的紋絲不亂的頭發(fā)上帝簇,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機(jī)與錄音忆嗜,去河邊找鬼己儒。 笑死,一個胖子當(dāng)著我的面吹牛捆毫,可吹牛的內(nèi)容都是我干的闪湾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绩卤,長吁一口氣:“原來是場噩夢啊……” “哼途样!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起濒憋,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤何暇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凛驮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裆站,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年黔夭,在試婚紗的時候發(fā)現(xiàn)自己被綠了宏胯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡本姥,死狀恐怖肩袍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婚惫,我是刑警寧澤氛赐,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站先舷,受9級特大地震影響艰管,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蒋川,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一蛙婴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尔破,春花似錦街图、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胆剧,卻和暖如春絮姆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秩霍。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工篙悯, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铃绒。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓鸽照,卻偏偏與公主長得像,于是被迫代替她去往敵國和親颠悬。 傳聞我的和親對象是個殘疾皇子矮燎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容