Qt可执行文件在发布文件夹中运行 - 程序文件中的运行时错误(x86)

时间:2016-01-29 18:29:23

标签: c++ sql qt sqlite runtime-error

在尝试运行我的Qt应用程序时,我似乎遇到了运行时错误。

我能够在发布模式下成功构建我的应用程序,并且它在release文件夹中运行得很好。但是,当用户安装它时,这不是它的位置。我需要它在SQLite中运行。

所以我把应用程序移到了那里。我最近在应用程序中添加了一些Qt5Sql.dll功能。所以我希望得到一些丢失的dll文件错误。我做到了。所以我找到了正确的dll文件(QMessageBox::warning)并将其移动到该目录中。现在我遇到了运行时错误。

为了弄清楚是什么导致了这个运行时错误,我扔了一堆sqlite = new SQLite(QString("%1%2").arg(myDocuments).arg(SQLite::DATABASE_NAME)); 来查看它何时收到错误。错误是由这行代码引起的:

QString

我检查过以确保我从QString("%1%2").arg(myDocuments).arg(SQLite::DATABASE_NAME)得到了预期的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,而我在运行时错误之前没有看到它。我在构造函数之前直接看到了sqldriver

有人知道可能导致这种情况的原因吗?

编辑:

我相信我错过了包含qsqlite.dll的{​​{1}}文件夹。我将该文件夹添加到我的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驱动程序显然可用,但我在这行代码中遇到了运行时错误:

QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");

2 个答案:

答案 0 :(得分:1)

为了简化您的生活,如果您有最新版本的Qt 5,则可以在应用程序上使用windeployqt将依赖项拉到正确的位置。

答案 1 :(得分:0)

经过多次拔毛后,我发现了这个问题。似乎我使用的Qt5* dll之一已经过时了。当我将dll文件从C:/Program Files...移动到我的发布文件夹并尝试从QtCreator运行发布版本时,我看到了这个错误:

Cannot mix incompatible Qt library (version 0x50100) with this library (version 0x50101)

看到这个后,我更新了Qt5*目录中的所有C:/Program Files (x86)/ApplicationName/ dll文件,解决了问题。