您好,登錄后才能下訂單哦!
近期剛剛學會用qml寫QT程序,感覺QML寫界面真的是要好很多的,尤其是在寫一些移動端的應用的時候。
最近在打包發布程序的時候遇到些問題,已經完美解決,希望給遇到同樣問題的Qter一些參考。
以前在打包Qwiget的程序的時候,一般是在編譯release版本后,直接點擊exe文件,把提示缺少的dll文件放在一起即可。但是這次直接點擊exe文件后,提示的是0xc000007b錯誤代碼。
在網上搜索解決方案后決定采用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來監測其使用到的動態鏈接庫。
可以看到,使用了很多動態鏈接庫,有的在C盤,推測應該是使用系統的接口,有的在應用所在文件夾,這些就是打包程序拷貝過來的依賴庫。但是還有一些,如下圖,竟然是在我的Qt開發環境下的,這些東西在別的計算機沒有啊,自然也就不能運行了。后來仔細想想,當初我是把qml文件夾拷貝過去就導致程序能運行了,那應該程序的運行和mingw53_32文件夾的東西應該關系也不大,而問題的關鍵應該是這個qml文件夾下的qmllocalstrongeplugin.dll,根據名字,這個動態鏈接庫實際上為qml中直接使用sqlite數據庫進行支持的,而我恰好使用了這一功能。
在打包工具打包好的軟件目錄中,巧好有一個QtQuick文件夾,里面沒有LocalStorage文件夾,于是我手動從開發環境安裝目錄把這個文件夾拷貝了過來。再點擊運行程序,已經沒有調用D盤的qmllocalstrongeplugin.dll文件了,轉而變成了這個
這說明在軟件根目錄包含了qmllocalstrongeplugin.dll后,軟件進行了優先使用,而不是去系統的環境變量中去查找。
為了驗證這個想法,我把改進后的軟件包拷貝到其他計算機進行運行,結果是可以運行的。問題得以解決。
總結一下,windeployqt作為一個優秀的軟件打包工具,確實為開發者帶來了不少方便。但是其仍存在一定的bug,在開發者使用較多的庫后,會出現拷貝依賴庫不全的情況。在以后有類似的情況發生時,可以用procexp軟件看看有什么必要的依賴庫是在開發環境安裝目錄的,手動添加即可。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。