QtSql应用程序不能在已部署的机器上工作
QtSql application not working on the deployed machine
我用Qt/c++做了一个软件。我需要将它部署在Windows 7(64位)上,这也是我开发软件的主机。
问题是我的软件可以与开发机器上的sqlite数据库交互,但是当我试图将我的软件部署到其他机器上时,它不能与那里的数据库交互。我也试着用"以管理员的身份运行",但是没有用。我也试过使用兼容模式。
数据库位于本地C:UsersusernameDesktopdb1.sqlite
,因此我的软件正常运行不需要联网或互联网。
我还将QtGui4
, QtCore
和QtSql4
dll包含在我的软件中。
谁能指出这里可能出了什么问题?
对,所以在提供解决方案之前,这里有几件事需要讨论,即:
1)当您在Windows机器上开发软件,并且它工作得很好,但在您部署软件的机器上却不行时,首先要检查的是依赖项。它们是否都正常运输?
我怎么去检查呢?好吧,这就是免费提供依赖项行走器的目的。你必须在部署软件的机器上运行;换句话说,在部署之后。不要在开发机器上运行它,如果它可以在那里工作。很好,这是关于调试的,所以让我们获得特定的Qt…
2)你正在使用QtSql模块来处理在Qt应用程序中很好的数据库交互。然而,主动态库,即。dll是关于抽象功能的。也就是说,所有Qt代码都不处理特定的驱动程序本身。
你可能会问为什么这样做?原因相对简单,因为QtSql模块提供了一个抽象接口,所以应该可以动态地更改数据库存储机制,而无需重新构建和重新部署软件。如果最终用户有一天决定使用另一个数据库怎么办?没有这个是不可能的。
是的,我们正在接近一个通用的设计原则,它被称为插件架构。Qt项目在这里有关于它的文档。现在,我们已经非常接近解决方案了,所以让我们再向前一步。
3)这可能是"太长;不要阅读"部分":当您部署应用程序时,您将需要让您的最终用户也拥有插件。这意味着,您需要在此上下文中发布两种类型的sql, QtSql4.dll以及特定的驱动程序插件。你显然错过了后者。因此,准备好要发货的东西。那是几秒,对吧?好的,所以你似乎目前正在使用sqlite和Qt 4,所以你需要得到sqlite Qt 4驱动程序。
你可以在这里自己检查Qt SQL数据库驱动程序:
SQL Database Drivers
根据您使用的sqlite版本,您有两个选项:
QSQLITE2 SQLite version 2
QSQLITE版本3
基本上,如果你必须这样做,这就是你自己构建驱动程序的方式:
cd %QTDIR%srcpluginssqldriverssqlite
qmake "INCLUDEPATH+=C:/SQLITE/INCLUDE" "LIBS+=C:/SQLITE/LIB/SQLITE3.LIB" sqlite.pro
nmake
一旦你有了那个dll,我相信你已经这样做了,如果你的程序已经在Windows上工作了,复制qsqlite4.dll
$QTDIRpluginssqldrivers到你的应用程序旁边的sqldrivers
目录,可执行文件。它将被Qt自动拾取,然后没有任何麻烦,除非你手动打乱路径,你不应该这样做。
您还应该将qsqlite4.dll
放在一个名为sqldrivers
的目录中,与您的应用程序可执行文件的发布版本放在一起。
- QSqlquery prepare()和bindvalue()不工作
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 如果C++依赖于机器,那么用C++编写的软件如何在不同的计算机上工作
- OpenCl代码在一台机器上工作,但我在另一台机器中得到了CL_INVALID_KERNEL_ARGS
- OpenGL Shader 在 AMD 机器中无法正常工作
- 在win10机器上使用winsock的UDP广播不工作
- c++ OpenCV VideoCapture在不同机器上的工作方式不同
- QtSql应用程序不能在已部署的机器上工作
- 如何编译一个程序在64位机器上工作
- 调用托管代码的非托管代码在开发机器上工作,而不是在部署机器上工作
- C++程序在两台不同的机器上编译.共享库在一个上正常工作.另一方面,类方法返回NULL
- 在我自己的机器上工作,但在 SPOJ 上工作
- pthread程序导致Linux机器出现分段错误.在Cygwin64上工作良好
- 为什么clock()不能在集群机器上工作
- Boost序列化在32位和64位机器之间不工作.任何其他序列化/压缩库