【问题标题】:Qt executable running in release folder - Runtime error in Program Files (x86)在发布文件夹中运行的 Qt 可执行文件 - Program Files (x86) 中的运行时错误
【发布时间】:2016-01-29 18:29:22
【问题描述】:

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

我能够在发布模式下成功构建我的应用程序,并且它在发布文件夹中运行良好。然而,当用户安装它时,这不是它的位置。我需要它在C:/Program Files (x86)/ApplicationName/application.exe 中运行。

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

为了找出导致此运行时错误的原因,我输入了一堆 QMessageBox::warnings 以查看它何时收到错误。错误是由这行代码引起的:

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.dllsqldriver 文件夹。我将该文件夹添加到我的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");

【问题讨论】:

  • Qt5Sql.dll 是通用 sql 库。您仍然需要路径中的 sqlite 插件库。这在运行时解决。不确定路径,在哪里搜索。
  • 我在想我可能需要专门针对 sqlite 的东西。但这到底是哪里?我没有看到任何Qt5Sqlite.dll 或类似的东西。
  • 您需要将&lt;qtdir&gt;\plugins 中的sqldrivers 文件夹放在您附近的application.exe。这是所有插件的通行规则。
  • @VladimirBershov 似乎是合法的,但我将这些相对于application.exe 放在哪里?
  • 文件夹sqldrivers 应该位于可执行文件附近,与您的程序application.exe 位于同一目录中。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在拉了很多头发之后,我发现了这个问题。我使用的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 文件并解决了问题。

    【讨论】:

      猜你喜欢
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多