Qt5在程序打包發佈時遇到的問題和解決方法

近期剛剛學會用qmlQT程序,感覺QML寫界面真的是要好很多的,尤其是在寫一些移動端的應用的時候。

最近在打包發佈程序的時候遇到些問題,已經完美解決,希望給遇到同樣問題的Qter一些參考。

以前在打包Qwiget的程序的時候,一般是在編譯release版本後,直接點擊exe文件,把提示缺少的dll文件放在一起即可。但是這次直接點擊exe文件後,提示的是0xc000007b錯誤代碼。

wKioL1mn8szgoqZ-AAAzcvUQxEw683.png-wh_50

在網上搜索解決方案後決定採用http://tieba.baidu.com/p/3730103947 中提到的windeployqt工具,但是按照這個方法做完以後,依賴庫是拷貝了很多,但是點擊主應用程序,竟然沒有反應!

後來又發現了這個帖子http://blog.csdn.net/jhkdiy/article/details/65443782,上面說拷貝過來的QCore.dll和系統安裝包中的md5值不一樣,真是神奇,按照上面的方法替換了QCore文件後,果然可以運行了,於是自以爲解決了問題,美滋滋。

第二天,程序要給別人演示了,由於我的開發機是臺式機,於是找了個筆記本把打包好的程序拷貝進去,點擊,竟然不能運行!

於是又是半天的搜索,終於找到了另一個帖子http://bbs.csdn.net/topics/391051284,上面雖然沒有解決根本問題,但是也提出了一個解決表面的方案。於是我按照上面的方法在筆記本上一模一樣的建立了一個到qml的路徑,並把qml文件夾中的所有文件一併拷走,程序完美運行,矇混過關了展示。

展示結束後,我試着找打包失敗的原因。一個朋友和我說他在使用中沒有出現過我說的問題,於是我就懷疑是不是我使用了什麼奇怪的庫才這樣的。首先,我又重新建立了一個新的helloworld程序,裏面用到的組件儘可能的少,打包發佈後,拷貝到其他電腦,完美運行。證明我的猜想是對的,確實是我使用了一些不該使用的控件。

第二步,我安裝了一個叫proceexp的軟件,用來看看這個軟件到底是在使用什麼依賴庫,在我的開發機中將程序運行起來,用procexp來監測其使用到的動態鏈接庫。

wKiom1mn8vHCgbLdAAFAZCAk2J8133.png-wh_50

 

可以看到,使用了很多動態鏈接庫,有的在C盤,推測應該是使用系統的接口,有的在應用所在文件夾,這些就是打包程序拷貝過來的依賴庫。但是還有一些,如下圖,竟然是在我的Qt開發環境下的,這些東西在別的計算機沒有啊,自然也就不能運行了。後來仔細想想,當初我是把qml文件夾拷貝過去就導致程序能運行了,那應該程序的運行和mingw53_32文件夾的東西應該關係也不大,而問題的關鍵應該是這個qml文件夾下的qmllocalstrongeplugin.dll,根據名字,這個動態鏈接庫實際上爲qml中直接使用sqlite數據庫進行支持的,而我恰好使用了這一功能。

wKiom1mn8wKBbZa2AABodDQJR5I095.png-wh_50

在打包工具打包好的軟件目錄中,巧好有一個QtQuick文件夾,裏面沒有LocalStorage文件夾,於是我手動從開發環境安裝目錄把這個文件夾拷貝了過來。再點擊運行程序,已經沒有調用D盤的qmllocalstrongeplugin.dll文件了,轉而變成了這個

wKiom1mn8yvjfyGPAAAVQi04cPI490.png-wh_50

這說明在軟件根目錄包含了qmllocalstrongeplugin.dll後,軟件進行了優先使用,而不是去系統的環境變量中去查找。

爲了驗證這個想法,我把改進後的軟件包拷貝到其他計算機進行運行,結果是可以運行的。問題得以解決。

總結一下,windeployqt作爲一個優秀的軟件打包工具,確實爲開發者帶來了不少方便。但是其仍存在一定的bug,在開發者使用較多的庫後,會出現拷貝依賴庫不全的情況。在以後有類似的情況發生時,可以用procexp軟件看看有什麼必要的依賴庫是在開發環境安裝目錄的,手動添加即可。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章