網(wǎng)站建設(shè)課本電腦零基礎(chǔ)培訓(xùn)學(xué)校
目錄
- 本地環(huán)境
- 問題描述
- 分析
- 解決方案
本地環(huán)境
本文將不會(huì)解釋如何利用Qt5編譯生成release類型的可執(zhí)行文件以及如何利用
windeployqt
生成可執(zhí)行的依賴庫,請自行百度。
環(huán)境 | 值 |
---|---|
操作系統(tǒng) | Windows 10 專業(yè)版(22H2) |
Qt版本 | Qt 5.15.2 |
Qt Creator版本 | 5.0.2 |
編譯器版本 | g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 7.3.0 |
發(fā)布類型 | release |
windeployqt 版本 | Qt Deploy Tool 5.12.12 |
問題描述
編寫完程序后直接利用Qt Creator發(fā)布release版本的可執(zhí)行文件(exe后綴),隨后再執(zhí)行如下命令獲取與可執(zhí)行文件相關(guān)的依賴庫:
windeployqt [可執(zhí)行文件]
發(fā)現(xiàn)確實(shí)生成一大堆*.dll,總目錄大小高達(dá)900+MB:
雙擊*.exe
文件,提示無法定位程序輸入點(diǎn)_ZN10QArrayData10deallocateEPs_yy :
分析
起初,以為是編譯器版本不對(duì)的問題,仔細(xì)對(duì)比了我用windeployqt
工具時(shí)進(jìn)入的環(huán)境以及我在Qt creator
軟件編譯的環(huán)境,發(fā)現(xiàn)并沒有什么問題,但是網(wǎng)上采用同樣的方式均能成功運(yùn)行*.exe
文件,百思不得其解。
后來我根據(jù)**關(guān)鍵詞"Qt 無法定位程序輸入點(diǎn)"**尋找解決方案,大部分是描述依賴庫的問題,我隨便拿了一個(gè)動(dòng)態(tài)庫libstdc++-6.dll
比對(duì)了我手頭其他MinGW
的環(huán)境,發(fā)現(xiàn)其實(shí)生成的這個(gè)動(dòng)態(tài)庫確實(shí)是編譯環(huán)境中的依賴庫,并沒有出錯(cuò)。
此外,我還以為是本機(jī)的問題,便嘗試將該文件以及依賴庫傳輸?shù)搅硗庖慌_(tái)電腦運(yùn)行,發(fā)現(xiàn)依然是同樣的問題,還注意到了這些文件居然高達(dá)900+MB,這我開始懷疑是不是發(fā)布的包選錯(cuò)了,我寫的程序僅僅幾個(gè)文件,后續(xù)還是沒有發(fā)現(xiàn)有什么錯(cuò)誤的點(diǎn)。
當(dāng)我重新使用windeployqt
生成時(shí),瞧了一眼日志信息,嘿,居然是以debug executable模式生成依賴庫的:
所以這肯定是會(huì)出現(xiàn)問題的,一個(gè)以Release
方式生成的可執(zhí)行文件,依賴庫卻按debug executable模式構(gòu)建,必然出現(xiàn)這種找不到程序入口的問題。
解決方案
在使用windeployqt
工具構(gòu)建依賴庫時(shí),強(qiáng)制它使用release
模式:
windeployqt [可執(zhí)行文件] --release
這樣就沒有問題了,可以看到生成的這些依賴庫以及可執(zhí)行文件總大小才幾十兆(未優(yōu)化):