尝试 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 文件未打开且没有错误消息的主要内容,如果未能解决你的问题,请参考以下文章
nssm和AlwaysUp来包装exe文件为windows服务