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 来确认所有依赖项都已解决。

相关推荐
肥or胖11 小时前
【FFmpeg 快速入门】本地播放器 项目
开发语言·qt·ffmpeg·音视频
小灰灰搞电子18 小时前
Qt Quick 粒子系统详解
开发语言·qt
暴躁茹20 小时前
Qt 将触摸事件转换为鼠标事件(Qt4和Qt5及以上版本)
开发语言·qt·计算机外设
大专生学编程21 小时前
QT简介和QT环境搭建
c++·qt
feiyangqingyun21 小时前
Qt/C++开发监控GB28181系统/视频点播没有ssrc问题的处理/兼容各种设备和应用场景需求
c++·qt·gb28181
小堃学编程1 天前
QT跨平台应用程序开发框架(10)—— Qt窗口
开发语言·qt
轩宇^_^1 天前
Qt CMake 学习文档
数据库·qt·学习
小徐不徐说1 天前
QT技巧之快速搭建串口收发平台
开发语言·c++·qt·串口·软件构建·个人开发·通信
天堂陌客1 天前
QT 交叉编译环境下,嵌入式设备显示字体大小和QT Creator 桌面显示不一致问题解决
开发语言·qt·字库
小堃学编程2 天前
QT跨平台应用程序开发框架(9)—— 容器类控件
开发语言·qt