尝试 Windows 部署 - .exe 文件未打开且没有错误消息

Posted

技术标签:

【中文标题】尝试 Windows 部署 - .exe 文件未打开且没有错误消息【英文标题】:Attempting Windows deployment - .exe file not opening with no error messages 【发布时间】:2020-04-04 21:33:28 【问题描述】:

我一直在尝试将我的应用程序部署到 Windows(一台未安装 QT 的笔记本电脑),我假设我遇到了依赖问题,但我没有收到任何错误消息。

当前使用:C:\Qt\5.12.6\mingw73_64

我的应用程序在 QtCreator 中运行良好,并且我使用了 windeployqt(也添加了 qmldir),最初运行良好。但是,我将我的 C:\Qt 文件夹更改为 C:\QtHidden(我在某处读到这模仿没有安装 QT)并且我的 .exe 文件没有加载。我可以点击它,但没有出现错误消息,我的鼠标光标变为加载光标片刻,然后什么也没有发生。有谁知道我可以记录发生的事情以便尝试修复它的方法?

我还尝试按照https://wiki.qt.io/Deploy_an_Application_on_Windows“初始部署”说明放置 /bin 中的每个 .dll 文件,以及插件和 qml 中的每个文件夹。同样没有错误,也没有出现打开问题,我不确定我还能做什么。

有什么想法吗?

谢谢

【问题讨论】:

我假设您的应用程序基于 QML UI,对吗?然后 QML 引擎由于某种原因无法加载您的根对象。在这种情况下,您不会收到任何错误。除非您更改 main.cpp 代码以在无法加载根元素的情况下打开 QMessageBox。 我实现了自定义记录器到文件以诊断此类问题。我建议你也这样做 另外,它是否有任何自定义 QML 插件扩展?这也可能是一个原因。 Qt 5.12.6 不会自动为此类扩展部署 .dll。我有一个项目,其中包含编译 .dll 并将其复制到目标文件夹的 QML 插件扩展。 5.12.6的windeployqt无法自行找到并转移到你的目标文件夹。 查看这篇文章evileg.com/en/post/154。在没有任何预安装 Qt 库的另一台机器上测试应用程序时,我使用相同的方法查看文本文件中的 QML 错误。 【参考方案1】:

实现自定义消息记录器。我曾经使用过这段代码(这个代码在我的实际应用程序中并且非常通用)。它也可以记录 QML 错误:

#include <QDateTime>
#include <QStandardPaths>
#include <QMessageBox>
#include <QDir>
#include <QDebug>
#include <QThread>
#include <QTextStream>
#include <iostream>

QUrl logFileUrl;
bool logToFile=true;
int appLogLevel=3;

void logger(QtMsgType type, const QMessageLogContext &context, const QString &msg)
    bool writeLogLine = false;
    QString line;
    QString msgType;
    QString time = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz");
    switch (type) 
    case QtInfoMsg:
        msgType = "Info";
        break;
    
    case QtDebugMsg:
        msgType = "Debug";
        break;
    
    case QtWarningMsg:
        msgType = "Warning";
        break;
    
    case QtCriticalMsg:
        msgType = "Critical";
        break;
    
    case QtFatalMsg:
        msgType = "Fatal";
        abort();
    
    
    line = QString("[%1] <%2> %3 (%4) | %5:%6 (%7) '%8'")
            .arg(time)
            .arg(static_cast<int>(reinterpret_cast<intptr_t>(QThread::currentThreadId())))
            .arg(msgType)
            .arg(context.category)
            .arg(context.file)
            .arg(context.line)
            .arg(context.function)
            .arg(msg);
    if (!logToFile)
        writeLogLine = false;
        std::cout << line.toStdString() << std::endl;
     else 
        switch (appLogLevel)
        case 0:
            writeLogLine = false;
            break;
        
        case 1:
            if (type == QtFatalMsg)
                writeLogLine = true;
            break;
        
        case 2:
            if (type == QtCriticalMsg || type == QtFatalMsg)
                writeLogLine = true;
            break;
        
        case 3:
            if (type != QtInfoMsg && type != QtDebugMsg)
                writeLogLine = true;
            break;
        
        case 4:
            if (type != QtDebugMsg)
                writeLogLine = true;
            break;
        
        case 5:
            writeLogLine = true;
            break;
        
        
    
    if (writeLogLine)
        QFile logFile(logFileUrl.toLocalFile());
        if (logFile.open(QIODevice::WriteOnly | QIODevice::Append)) 
            QTextStream ts(&logFile);
            ts << line << endl;
            logFile.close();
         else 
            QMessageBox msgBox;
            msgBox.setWindowTitle("WARNING");
            msgBox.setIcon(QMessageBox::Warning);
            msgBox.setText(logFile.errorString());
            msgBox.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
            msgBox.exec();
        
    

安装程序使用qInstallMessageHandler:

qInstallMessageHandler(logger);

在此处查看文档https://doc.qt.io/qt-5/qtglobal.html#qInstallMessageHandler

附: - 从那里运行时,此代码还会显示您的 QtCreator 实例中的所有消息。

【讨论】:

谢谢,user3417815!您发送给我的记录器和文档正是我所需要的。它最终成为一个 SQLite 错误 - 但是一旦我看到错误是什么就很容易解决!

以上是关于尝试 Windows 部署 - .exe 文件未打开且没有错误消息的主要内容,如果未能解决你的问题,请参考以下文章

在windows部署service

nssm和AlwaysUp来包装exe文件为windows服务

Matlab 部署工具-Windows 独立应用程序

windows基于xampp部署testlink

尝试下载 EXE 文件后,PowerShell (x64) 停止工作 (Windows 7)

当应用程序未打开时,可以在 Firebase 消息服务中完成哪些任务?