QT程序异常结束解决方法

在用QT开发第三方SDK的时候,刚开始是运行正常的,但是重装系统之后再次运行程序总是出现:程序异常结束。

以下方法尝试无效,但不失为一种排查方法:

  1. 重新安装QT;
  2. 检查Qt Creator配置,编译器位数和SDK匹配;
  3. 清理(Clean)和重新构建(Rebuild)项目;
  4. 检查.pro 文件包含的所有必要的依赖文件路径是否正确;
cpp 复制代码
INCLUDEPATH += $$PWD/include
LIBS += $$PWD/lib/XX.lib
  1. 确保XX.dll 位于程序的可执行文件所在的目录(release 目录);

后面发现只要调用第三方SDK的库函数就会出现这个问题,如果不调用就正常,所以从排查dll文件入手。

以下几种方法可以排查dll问题:

  1. 有些SDK可能依赖特定版本的运行时库。例如,Visual C++ Redistributable。尝试安装后无效。
  2. 确保 XX.dll 位于程序的可执行文件所在的目录( release 目录),或者将其路径添加到系统的 PATH 环境变量中。尝试后无效。
  3. 检查SDK是哪种模式:Debug模式和release模式;
  4. 确保 XX.dll 及其依赖项具有正确的文件权限。所有相关文件都应具有可读和可执行权限。
  5. 尝试使用 DLL 的完整路径来加载:
cpp 复制代码
#include <QCoreApplication>
#include <QDebug>
#include <Windows.h> // 如果使用Windows平台

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 使用完整路径检查DLL是否加载成功
    HMODULE hModule = LoadLibrary(L"C:\\path\\to\\XX.dll");
    if (!hModule)
    {
        qDebug() << "Failed to load XX.dll";
        return -1;
    }

    qDebug() << "XX.dll loaded successfully";

    return a.exec();
}

如果加载失败,查看失败的原因:

cpp 复制代码
#include <QCoreApplication>
#include <QDebug>
#include <Windows.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 使用完整路径检查DLL是否加载成功
    HMODULE hModule = LoadLibrary(L"C:\\path\\to\\XX.dll");
    if (!hModule)
    {
        DWORD errorMessageID = ::GetLastError();
        LPSTR messageBuffer = nullptr;
        size_t size = FormatMessageA(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);

        QString message = QString::fromLocal8Bit(messageBuffer, size);
        LocalFree(messageBuffer);

        qDebug() << "Failed to load XX.dll:" << message;
        return -1;
    }

    qDebug() << "XX.dll loaded successfully";

    return a.exec();
}

可以看到显示:Failed to load XX.dll: "找不到指定的模块。说明dll有依赖的模块没有找到。

  1. 下载并安装 Dependency Walker:Dependency Walker 官方网站

启动 Dependency Walker,打开 XX.dll 文件。检查缺失的依赖项。

Dependency Walker 会列出所有的依赖项及其状态。如果有缺失的依赖项,会显示为红色的 "X"。记录这些缺失的 DLL 文件。

结合Dependency Walker 的结果,发现缺少WinPcap.dll。我在安装Npcap后不再出现错误。

WinPcap 已经不再维护,使用Npcap,是WinPcap替代品。

如果有其它dll缺失继续安装。重新运行 Dependency Walker 来确认所有依赖项都已解决。

相关推荐
小短腿的代码世界1 天前
从.qrc到rcc编译器:Qt资源系统的隐秘运作机制与大型项目性能突围
开发语言·qt
我在人间贩卖青春1 天前
重学Qt——Qt常用界面组件
qt
Larry_Yanan1 天前
QML面试常见问题(一)QML中组件呈现方式的方法有哪些
开发语言·c++·qt·ui·面试
程序leo源2 天前
Qt信号与槽深度详解
c语言·开发语言·数据库·c++·qt·c#
yu85939582 天前
基于 QT5.7.0 的八线激光雷达点云聚类实现
开发语言·qt·聚类
努力努力再努力wz2 天前
【C++高阶数据结构系列】:时间轮定时器详解:原理分析与代码实现,带你从零手撕时间轮!(附时间轮的实现源码)
c语言·开发语言·数据结构·c++·qt·算法·ui
郝学胜-神的一滴2 天前
Qt 高级开发 006: 架构全解 + 高效学习指南
开发语言·c++·qt·程序人生·架构
会开花的二叉树2 天前
Qt信号槽这套机制
开发语言·qt
小短腿的代码世界2 天前
从KB到字节:Qt行情数据压缩与传输优化的全链路透视——LZ4、Snappy与自定义二进制协议的极限压榨
开发语言·qt
xiaoye-duck2 天前
Qt 入门指南:从Qt历史背景、框架认知到安装和环境搭建
开发语言·qt