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应该就可以正常运行了。