Qt软件打包后报错“无法定位程序输入点_ZN10QArrayData10deallocateEPs_jj于动态链接库..... .exe上。”解决办法

在将 Qt 程序构建、运行、打包之后点击生成的 exe 文件发现出现以下“无法找到入口”错误。
image.png

无法定位程序输入点_ZN10QArrayData10deallocateEPs_jj于动态链接库..... .exe上。

之后发现是因为构建项目时使用的编译工具和打包软件时使用的编译工具不一样所导致的。
打包Qt项目的过程如下:

  1. 使用 Qt Create 打开项目。
    如下图所示,选择 release ,有时需要选择编译工具,可以看到图中的编译工具是MinGW 32bit
    image.png
  2. 编译之后在工程项目文件夹下可看到 release 文件夹
    image.png
  3. 打开关于release相关的文件夹,找到该目录下release目录下的.exe程序。将这个.exe文件拷贝出来,创建一个单独的文件夹,放在这个文件夹下。
  4. Windows图标找到Qt软件,如下图所示,本人电脑里有5个编译工具,找到与第一步里相同的编译工具,打开。
    image.png
    如图所示:
    image.png
  5. 在该命令行窗口中通过盘符和cd命令转到才拷贝出来的exe程序所在的目录。
    image.png
  6. 使用windeployqt命令打包,即windeployqt 文件名.exe 敲击回车。这一步操作是将所需的库文件全都拷贝到exe程序的当前文件:
    image.png
  7. 此时程序目录如下,点击exe文件即可正常运行程序。将该目录整体拷贝到其它Windows系统中也可直接运行。
    image.png
### 关于 Qt无法定位程序输入 `_ZN10QArrayData10deallocateEPs_jj` 的解决方案 当遇到 `无法定位程序输入_ZN10QArrayData10deallocateEPs_jj动态链接库 ... .exe 上` 这类错误时,通常表明应用程序尝试调用某个 DLL 文件中的函数失败。以下是可能的原因及其对应的解决方法: #### 原因分析 1. **DLL 版本不匹配** 错误可能是由于使用的 Qt 库版本与项目依赖的其他库版本不一致引起的。例如,某些旧版 Qt 可能未定义该符号,或者新版本引入了不同的实现方式[^1]。 2. **缺少必要的运行时环境** 如果系统的运行环境中缺失特定的 C++ 或 Qt 运行时组件,则可能导致此类问题。这通常是由于安装过程中遗漏了一些必需文件所致。 3. **编译器设置差异** 使用不同编译器或编译选项构建的应用程序可能会导致二进制兼容性问题。如果项目的静态库和动态库是由不同工具链生成的,也可能引发此错误。 4. **第三方库冲突** 当项目中集成了多个第三方库(如 zlib),这些库之间可能存在命名空间或其他形式的冲突,从而干扰正常加载过程[^2]。 #### 解决方案 ##### 方法一:确认并更新至最新版本的 Qt 和相关依赖项 确保所使用的 Qt SDK 是最新的稳定发行版,并重新下载官方发布的预编译二进制包来替换现有的本地副本。此外还需验证是否有任何补丁发布针对已知缺陷进行了修复。 ##### 方法二:检查系统路径配置以及是否存在重复的 DLL 文件 通过命令提示符执行以下操作可以排查潜在的问题: ```cmd where QtCore.dll ``` 上述指令会列出当前目录下所有名为 `QtCore.dll` 的位置。如果有多个版本共存,则需清理冗余条目只保留唯一正确的那个实例。 ##### 方法三:调整项目属性以强制指定正确的编译参数 对于 Visual Studio 用户来说,在工程属性对话框内的 C/C++ -> Code Generation 节处应统一设定 Runtime Library 参数为 `/MDd`(Debug) 或者 `/MD`(Release),以此保证最终产物能够正确解析外部引用关系。 ##### 方法四:手动注入调试信息以便进一步诊断具体环节上的异常状况 可以通过附加日志记录机制捕获更详细的上下文数据用于后续分析工作;另外也可以借助 Process Monitor 工具监视目标进程在整个生命周期里的行为轨迹寻找蛛丝马迹。 --- ### 示例代码片段展示如何安全地处理动态链接资源 下面给出了一段简单的 Python 实现示例演示怎样优雅地管理 Windows 平台下的共享对象句柄释放流程避免内存泄漏等问题发生: ```python import ctypes from contextlib import suppress def load_library(libname): try: lib = ctypes.WinDLL(libname) return lib except OSError as e: print(f"Failed to load library {libname}: {e}") raise SystemExit(-1) with suppress(OSError), load_library("mydll") as my_dll_handle: func_ptr = getattr(my_dll_handle, "_ZN10QArrayData10deallocateEPs_jj", None) if callable(func_ptr): result = func_ptr() print(result) ``` ---
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值