发布文件夹中的 Qt 可执行文件 运行 - Program Files (x86) 中的运行时错误
Qt executable running in release folder - Runtime error in Program Files (x86)
我在尝试 运行 我的 Qt 应用程序时似乎遇到了 运行 时间错误。
我能够在发布模式下成功构建我的应用程序,它 运行 放在发布文件夹中就好了。但是,当用户安装它时,它不会位于此位置。我需要它 运行 在 C:/Program Files (x86)/ApplicationName/application.exe
.
所以我把应用程序移到了那里。我最近向应用程序添加了一些 SQLite
功能。所以我希望得到某种丢失的 dll 文件错误。我做到了。所以我找到了正确的 dll 文件 (Qt5Sql.dll
) 并将其移动到该目录中。现在我遇到运行时错误。
为了找出导致此运行时错误的原因,我输入了一堆 QMessageBox::warning
以查看它何时出现错误。错误是由这行代码引起的:
sqlite = new SQLite(QString("%1%2").arg(myDocuments).arg(SQLite::DATABASE_NAME));
我检查以确保我从 QString("%1%2").arg(myDocuments).arg(SQLite::DATABASE_NAME)
得到了预期的 QString
,我确实是。
sqlite.cpp
中的构造函数如下所示:
SQLite::SQLite(const QString& path)
{
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName(path);
if (!database.open())
{
QMessageBox::warning(NULL, "Error", "Failed to open database.");
}
}
奇怪的是我知道我什至没有进入那个构造函数,因为我在构造函数的第一行之前放了一个 QMessageBox::warning
而我在运行时错误之前没有看到它。不过,我直接在构造函数之前看到了 QMessageBox::warning
。
有人知道是什么原因造成的吗?
编辑:
我想我丢失了包含 qsqlite.dll
的 sqldriver
文件夹。我将该文件夹添加到我的 exe
文件所在的位置,但我仍然收到 运行 时间错误。为了调试目的,我在代码中添加了以下内容:
QStringList drivers = QSqlDatabase::drivers();
QString ds;
int len = drivers.length();
for (int x = 0; x < len; x++)
{
ds.append(QString("%1\n").arg(drivers[x]));
}
QMessageBox::warning(this, "DRIVERS", ds);
sqlite = new SQLite(QString("%1%2").arg(myDocuments).arg(SQLite::DATABASE_NAME));
QMessageBox
显示:
QSQLITE
QODBC
QODBC3
QPSQL
QPSQL7
但是,在我单击对话框中的“确定”之后,我仍然收到 运行时间错误。尽管 QSQLITE
驱动程序显然可用,但我在这行代码中收到 运行time 错误:
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
经过多次纠缠,我发现了问题所在。似乎我使用的 Qt5*
dll 之一已经过时了。当我将 dll 文件从 C:/Program Files...
移动到我的发布文件夹并尝试 运行 来自 QtCreator
的发布版本时,我看到了这个错误:
Cannot mix incompatible Qt library (version 0x50100) with this library (version 0x50101)
看到这个后,我更新了 C:/Program Files (x86)/ApplicationName/
目录中的所有 Qt5*
dll 文件并解决了问题。
为了简化您的生活,如果您有最新版本的 Qt 5,您可以在您的应用程序上使用 windeployqt 将依赖项拉到正确的位置。
我在尝试 运行 我的 Qt 应用程序时似乎遇到了 运行 时间错误。
我能够在发布模式下成功构建我的应用程序,它 运行 放在发布文件夹中就好了。但是,当用户安装它时,它不会位于此位置。我需要它 运行 在 C:/Program Files (x86)/ApplicationName/application.exe
.
所以我把应用程序移到了那里。我最近向应用程序添加了一些 SQLite
功能。所以我希望得到某种丢失的 dll 文件错误。我做到了。所以我找到了正确的 dll 文件 (Qt5Sql.dll
) 并将其移动到该目录中。现在我遇到运行时错误。
为了找出导致此运行时错误的原因,我输入了一堆 QMessageBox::warning
以查看它何时出现错误。错误是由这行代码引起的:
sqlite = new SQLite(QString("%1%2").arg(myDocuments).arg(SQLite::DATABASE_NAME));
我检查以确保我从 QString("%1%2").arg(myDocuments).arg(SQLite::DATABASE_NAME)
得到了预期的 QString
,我确实是。
sqlite.cpp
中的构造函数如下所示:
SQLite::SQLite(const QString& path)
{
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName(path);
if (!database.open())
{
QMessageBox::warning(NULL, "Error", "Failed to open database.");
}
}
奇怪的是我知道我什至没有进入那个构造函数,因为我在构造函数的第一行之前放了一个 QMessageBox::warning
而我在运行时错误之前没有看到它。不过,我直接在构造函数之前看到了 QMessageBox::warning
。
有人知道是什么原因造成的吗?
编辑:
我想我丢失了包含 qsqlite.dll
的 sqldriver
文件夹。我将该文件夹添加到我的 exe
文件所在的位置,但我仍然收到 运行 时间错误。为了调试目的,我在代码中添加了以下内容:
QStringList drivers = QSqlDatabase::drivers();
QString ds;
int len = drivers.length();
for (int x = 0; x < len; x++)
{
ds.append(QString("%1\n").arg(drivers[x]));
}
QMessageBox::warning(this, "DRIVERS", ds);
sqlite = new SQLite(QString("%1%2").arg(myDocuments).arg(SQLite::DATABASE_NAME));
QMessageBox
显示:
QSQLITE
QODBC
QODBC3
QPSQL
QPSQL7
但是,在我单击对话框中的“确定”之后,我仍然收到 运行时间错误。尽管 QSQLITE
驱动程序显然可用,但我在这行代码中收到 运行time 错误:
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
经过多次纠缠,我发现了问题所在。似乎我使用的 Qt5*
dll 之一已经过时了。当我将 dll 文件从 C:/Program Files...
移动到我的发布文件夹并尝试 运行 来自 QtCreator
的发布版本时,我看到了这个错误:
Cannot mix incompatible Qt library (version 0x50100) with this library (version 0x50101)
看到这个后,我更新了 C:/Program Files (x86)/ApplicationName/
目录中的所有 Qt5*
dll 文件并解决了问题。
为了简化您的生活,如果您有最新版本的 Qt 5,您可以在您的应用程序上使用 windeployqt 将依赖项拉到正确的位置。