QT編譯發布程序后報錯如缺少dll、“應用程序無法正常啟動(0xc000007b)”的可能解決方法
最近項目要用qt,因為初學沒有經驗,遇到些小問題常常沒什么頭緒,也查不到解決方法,剛剛還因為低端錯誤耽誤了群里一位朋友的時間。決定以后如果遇到類似小問題就記錄下來,也方便初學者少走彎路了。
首先,qt動態編譯發布程序一般是在Qtcreater中編譯出release版本並運行后,在生成的release版本文件夾中取出exe。單獨運行exe時會報錯缺少dll,出現這個問題直接在qt庫的文件夾中搜索提示的dll,放入exe所在的文件夾即可。
我遇到的(0xc000007b)問題也出在這個階段,也是太粗心了。
報錯(0xc000007b)的可能解決方法:
① 許多dll應當取自Qt5.4.0\5.4\msvc2013_64\bin目錄下,而在Qt5.4.0\Tools\QtCreator\bin中也有許多同名的dll,直接搜索文件時Qt5.4.0\Tools\QtCreator\bin中的dll往往先蹦出來,如果將這些dll放到exe文件夾中,就會報錯“應用程序無法正常啟動(0xc000007b)”。碰到這種情況真是無解了,完全沒有線索……所以如果出現這個問題,先確認下所拷貝dll的來源是否正確,qt程序對dll的要求是比較高的。
推薦使用一款軟件Process Explorer來查詢exe所依賴的dll有哪些以及具體地址在哪里,防止犯錯。
在軟件中進行如下設置:
之后打開Qtcreater,編譯程序並運行,在Process Explorer中會出現exe的進程,鼠標選中后可在下方查看其所依賴的dll及其位置。一般在系統盤中的dll可以不管,主要看PATH位於Qt文件夾中的dll,那些有很多往往就是exe所需要的dll。
② qt5發布程序對於dll的放置也有一些要求和變化,在網上見到有人出現0xc000007b問題是因為qwindows.dll未放入。這里轉發 derryzhang 的博文http://blog.csdn.net/derryzhang/article/details/17002193,講解得非常詳細。
由此,最后dll放置結構應是如此:
- --platforms
- --qwindows.dll
- --*.dll
- --accessible //Qt5.4中無此文件夾,故可忽略
- --qtaccessiblewidgets.dll//Qt5.4中無此文件,故可忽略
- --*.dll
- --plugins
- --folders
- --*.dll
- --yourApp.exe
- --Qt5Core.dll //Qt5版本
- --Qt5Gui.dll
- --Qt5Widgets.dll
- --icudt49.dll //Qt5.4中為icudt53.dll,下同
- --icuin49.dll
- --icuuc49.dll
- --libEGL.dll //此兩個dll如未用到openGL應該也可不放
- --libGLESv2.dll
- --libgcc_s_sjlj-1.dll(mingw)//編譯器為mingw時才需要的三個文件
- --libstdc++-6.dll(mingw)
- --libwinpthread-1.dll(mingw)
- --msvcr110.dll(msvc)//編譯器為msvc時才需要的兩個文件,對應所用vs的版本號
- --msvcp110.dll(msvc)
截張我的(gdal111.dll為第三方的,可忽略):
③ 在某些論壇有人稱是程序中存在指針越界的情況(編譯可以運行怎么會出現這個情況,不解……),如果以上方法都不能解決問題,可嘗試以此為思路。
在發布程序時如果遇到其他問題可參考 江湖么名 的這篇博文:http://www.cnblogs.com/mmix2009/p/3536825.html
對其他問題也有很詳細的歸納。