【问题标题】:QtSql application not working on the deployed machineQtSql 应用程序无法在已部署的机器上运行
【发布时间】:2014-09-10 08:57:37
【问题描述】:

我用 Qt/C++ 制作了一个软件。我需要将它部署在 Windows 7(64 位)上,这也是我开发软件的主机。

问题是我的软件可以与开发机器上的 sqlite 数据库交互,但是当我尝试在其他机器上部署我的软件时,它无法与那里的数据库交互。我也尝试使用“以管理员身份运行”,但没有帮助。我也尝试过使用兼容模式。

数据库位于本地C:\Users\username\Desktop\db1.sqlite,因此我的软件无需联网或互联网即可正常运行。

我的软件中还包含了QtGui4、QtCore 和QtSql4 dll。

有人能指出这里可能出了什么问题吗?

【问题讨论】:

  • 伴侣我说软件可以与开发机器上的数据库对话。 “talk”表示可以执行数据库操作,如打开、读取、删除等。每个错误都不需要在代码中。当我说它在开发机器上按预期执行时,意味着代码是完美的。
  • 是的,我在部署我的软件之前运行了 Dependency Walker。我已将 QtSql4.dll 包含在 exe 文件夹本身中。我需要将它放在 exe 文件夹内的单独文件夹“sqldrivers”中吗?
  • 我编辑了问题并提交了详细的答案,以便将来成为此类问题的适当规范。
  • @hyde:我正在考虑将其作为骗子关闭,但后来我决定关闭它可能更有意义,因为我提交了一个详尽的答案,这本来可以在那里完成,同样,诚然,但在像这样的低容量标签中(这是一种耻辱),它很难达到其他答案的水平,更不用说被接受了。

标签: c++ windows qt sqlite qtsql


【解决方案1】:

好的,所以在提供解决方案之前,这里有几件事需要讨论,即:

1) 当您在 Windows 机器上开发软件时,它就像一个魅力,但不是在您部署软件的机器上,首先要检查的是依赖关系。它们都正常发货了吗?

我将如何四处检查它?嗯,这就是免费提供dependency walker 的目的。您必须在部署软件的机器上运行;换句话说,在部署之后。如果它在那里工作,请不要在开发机器上运行它。好的,这是关于调试的,所以让我们具体了解 Qt...

2) 您正在使用 QtSql 模块来处理数据库交互,这在 Qt 应用程序中是很好的。然而,主要的动态库,又名。 QtSql4.dll 是关于抽象功能的。也就是说,所有 Qt 代码本身并不处理特定的驱动程序。

您可能会问为什么要这样做?原因比较简单,因为 QtSql 模块提供了一个抽象接口,所以应该可以在不重新构建和重新部署软件的情况下即时更改数据库存储机制。如果最终用户有一天决定使用另一个数据库怎么办?没有这个是不可能的。

是的,我们在这里接近一个通用的设计原则,称为插件架构。 Qt 项目有关于它的文档here。现在,我们已经非常接近解决方案了,所以让我们更进一步。

3) 这可能是“太长;请勿阅读”部分:当您部署应用程序时,您需要让最终用户也拥有插件。这意味着,您需要在此上下文中提供两种类型的 sql,即 QtSql4.dll 以及特定的驱动程序插件。你显然错过了后者。因此,准备将其运送。但是第二个,对吧?好的,所以您目前似乎正在使用 sqlite 和 Qt 4,因此您需要为此获取 sqlite Qt 4 驱动程序。

您可以在此处自行检查 Qt SQL 数据库驱动程序:

SQL Database Drivers

根据您使用的 sqlite 版本,您有两种选择:

QSQLITE2 SQLite version 2

QSQLITE SQLite version 3

基本上,如果您必须这样做,您将自己构建驱动程序:

cd %QTDIR%\src\plugins\sqldrivers\sqlite
qmake "INCLUDEPATH+=C:/SQLITE/INCLUDE" "LIBS+=C:/SQLITE/LIB/SQLITE3.LIB" sqlite.pro
nmake

一旦你有了那个 dll,如果你的程序已经在 Windows 上运行,我相信你已经这样做了,将 qsqlite4.dll $QTDIR\plugins\sqldrivers 复制到你的应用程序旁边的 sqldrivers 目录中,可执行文件。除非你手动弄乱了你不应该做的路径,否则 Qt 会自动拾取它,而不会有任何麻烦。

4) 话虽如此,这是一种完全通用的方法,因此如果您将 sqlite 替换为您需要的 SQL 类型,这将适用于任何 SQL 类型。

【讨论】:

  • 这应该属于“支持答案”类别。感谢您的解释。需要感谢。
  • @user3855415 在 SO 上“欣赏”答案的正常方法是对其进行投票。
  • @hyde:我认为他没有足够的声誉。他至少需要 15 个。
【解决方案2】:

您还应该将qsqlite4.dll 放在一个名为sqldrivers 的目录中,与您的应用程序可执行文件的发布版本一起。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2023-03-27
相关资源
最近更新 更多