QT常見問題(1)
1.問題描述
Qt在編譯器中直接運行沒有任何問題,但是進入exe生成目錄直接雙擊運行就報錯:文件無法定位程序輸入點_zn10qarraydata10deallocateepsyy于動態鏈接庫。
2.問題原因
這個錯誤通常是由于程序運行時找不到Qt的核心動態鏈接庫(DLL)導致的。在開發環境中,編譯器會自動設置好環境變量,所以程序可以找到Qt的DLL。但是當我們直接雙擊exe運行時,系統可能找不到這些DLL。
3.解決方法
-
將所需的Qt DLL文件復制到exe文件所在的目錄。
-
或者將Qt的bin目錄添加到系統的PATH環境變量中。
由于我們更傾向于分發程序時讓用戶直接運行而不設置環境變量,所以通常采用第一種方法。而且環境變量設置有點玄學在里面,你看著設置好了沒問題,程序運行就是不行。
4.具體步驟
-
找到程序依賴的Qt DLL文件。
-
將這些DLL復制到exe所在的目錄。
如何找到依賴的DLL?
- 可以使用工具,如windeployqt(Qt自帶的工具),它能夠自動將程序運行所需的Qt相關文件復制到exe所在目錄。
5.操作步驟
-
打開Qt命令行
在開始菜單中找到,例如“Qt 5.15.2 (MinGW 8.1.0 64-bit)”這樣的命令行并打開。
-
導航到exe目錄
使用cd命令切換到exe所在的目錄。
-
運行部署命令
執行命令:windeployqt 你的程序名.exe
工具會自動復制所有必需的Qt庫、插件和依賴項到當前exe目錄。命令運行成功的窗口如下,exe所在目錄也會多一些DLL文件和文件夾,文件夾中也是DLL文件。
在使用windeployqt工具構建依賴庫時,確認自己是以debug模式還是release模式生成依賴庫,模式查看如上圖箭頭所指。如果與自己的運行模式不一致,可以使用windeployqt 你的程序名.exe --debug或者windeployqt 你的程序名.exe --release強制以debug executable模式或者release executable模式運行。
注意:如果程序使用了其他第三方庫(非Qt的),則需要手動將這些庫的DLL也復制到exe目錄。
另外,如果報錯中提到的具體函數(如_zn10qarraydata10deallocateepsyy)是QtCore庫中的,那么很可能是因為
QtCore的版本不匹配或者沒有找到。使用windeployqt可以解決這個問題。
如果使用了MinGW,還需要將MinGW的運行時庫(例如libgcc_s_seh-1.dll, libstdc+±6.dll, libwinpthread-1.dll)也復制到exe目錄。這些文件在MinGW的安裝目錄下的bin文件夾里。
完成上述步驟后,再次雙擊exe應該就可以正常運行了。