c++ - 在发布文件夹中运行的 Qt 可执行文件 - Program Files (x86) 中的运行时错误

标签 c++ sql qt sqlite runtime-error

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

我能够在 Release模式下成功构建我的应用程序,它在发布文件夹中运行得很好。但是,当用户安装它时,它不会位于此位置。我需要它在 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.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");

最佳答案

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

关于c++ - 在发布文件夹中运行的 Qt 可执行文件 - Program Files (x86) 中的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35091529/

相关文章:

sql - 在 PostgreSQL 中按字母顺序搜索 friend

c++ - QWidgets可以添加到QWindow吗?

Qt websocket 服务器示例不起作用

c++ - 修剪二叉树的代码

c++ - C++ 中的动态矩阵

Java 循环显示 SQL 国家/地区表中的多种语言

c++ - 让 QtWebKit 在 Qt Creator 中工作

c++ - OpenMP - 只创建一次线程

c++ - 如何测量 Boost 图使用的内存?

sql - 如何从 CSV 获取 SQL LOAD DATA 以在加载时遵循列类型?