gpt4 book ai didi

qt - 如何使Qt了解QMYSQL驱动程序

转载 作者:行者123 更新时间:2023-12-04 05:14:58 27 4
gpt4 key购买 nike

我正在尝试从Qt应用程序访问MySql数据库,但出现以下错误:

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QSQLITE2

我发现这很奇怪,原因是我的Qt文件夹上有libqsqlmysql.so。我什至尝试将MySql驱动程序编译为静态插件,并将其添加到我的.pro文件中,如下所示:
QTPLUGIN += qsqlmysql

但这也会生成相同的运行时错误(它必须已经找到了插件,因为编译应用程序没有错误)

我想念什么?我想避免不得不从源代码编译Qt,因为这也必须在部署计算机上无缝运行。

顺便说一句:即使我正在Linux上进行开发和测试,我仍需要支持Windows。我在Windows上会遇到同样的问题吗?如何在Linux和Windows中编译并链接MySql驱动程序?

解决方案:

在遵循@Sergey的建议后,我对应用程序进行了跟踪,将输出重定向到grep,以便我可以搜索“mysql”,而令我惊讶的是,应用程序 不是而不是在我有libqsqlmysql的QTDIR/plugins/sqldrivers上寻找插件因此, 在查看QTDIR/lib时是。将插件复制到lib文件夹后,MySql连接起作用。

最佳答案

尝试使用dlopen()打开共享库,看看它是否已加载,如果没有加载,dlerror()会告诉您什么。我总是在Windows上遇到类似的问题。 LoadLibrary()/GetLastError()为我节省了很多次(最后一次是因为某些libiconv/libintl DLL版本错误)。在插件上运行ldd可能也有帮助。

如果dlopen()工作正常,请尝试使用QPluginLoader加载插件。如果未加载,请检查插件的buildkey。我通常通过在插件上运行字符串然后寻找诸如“buildkey”或“QT_PLUGIN_VERIFICATION_DATA”之类的字符串来以肮脏的方式进行操作。仅查看构建 key 及其周围的内容可能会给您一个想法。例如,您可能意识到在 Debug模式下编译应用程序的同时,您已在 Release模式下编译了插件。在这种情况下,构建 key 将不匹配,并且插件将无法加载。构建 key 中的所有内容都必须与您的配置匹配。请注意,版本和构建 key 的检查方式有所不同:构建 key 必须完全匹配(或匹配一些称为QT_BUILD_KEY_COMPAT的黑魔法),但在版本中,只有主版本必须完全匹配,次版本必须是Qt版本。插件使用或更高版本进行了编译,并且补丁程序级别被忽略。因此,如果您的插件是使用Qt 4.x.y编译的,那么它将适用于Qt 4.z. *版本,其中z> = x。这实际上是有道理的。

如果构建 key 看起来还可以(如果您不知道这一点的话,这不太可能),则不妨查看QLibraryPrivate::isPlugin()源代码以找出问题所在,但这对我来说似乎并不容易。 (尽管在调试器中运行此命令可能会有所帮助)。

如果QPluginLoader确实加载了插件,请检查它是否在正确的目录中并具有正确的权限。如果您到那时仍不能解决问题,那么该看一下实际加载这些插件的SQL模块源代码了。但这是极不可能的。我无数次地遇到了这个问题,它总是要么库未加载,要么构建键不匹配。

QPluginLoader成功加载插件之后的另一种方法是使用strace来确定程序是否至少尝试打开插件文件。在strace输出中搜索“sqldrivers”或“plugins”之类的内容也应该放弃Qt正在搜索其插件(特别是SQL驱动程序)的目录。

更新

是否可以将驱动程序编译为静态插件,而不用担心任何事情?我们试试看:

d:\Qt4\src\plugins\sqldrivers\psql>qmake CONFIG+=static LIBS+=-Ld:/programs/Post
greSQL/lib INCLUDEPATH+=d:/programs/PostgreSQL/include
d:\Qt4\src\plugins\sqldrivers\psql>make

它编译良好,现在我在QTDIR/plugins/sqldrivers中找到了libqsqlpsql.a(发行版)和libqsqlpsqld.a(调试)(在Windows上是正确的位置)。我在这里使用PostgreSQL驱动程序,但是我认为我没有安装的MySQL不会有任何不同。好的,让我们用它来编译一些真实的程序:
d:\alqualos\pr\archserv>qmake QTPLUGIN+=qsqlpsql PREFIX=d:/alqualos LIBS+=-Ld:/g
nu/lib INCLUDEPATH+=d:/gnu/include LIBS+=-Ld:/programs/PostgreSQL/lib LIBS+=-lpq

请注意,我必须手动链接到libpq,否则链接器会提示 undefined reference 。有趣的是,qmake知道qsqlpsql位于QTDIR/plugins/sqldrivers中,并相应地设置了编译器和链接器选项。因此,它仍然需要在正确的位置工作,只需要不必担心用户会遇到与仅在编译期间使用相同的问题。另一种选择是只使用 LIBS+=-Lpath/to/plugin LIBS+=-lqsqlpsql而不是 QTPLUGIN+=qsqlpsql,至少文档说它应该可以工作,但我尚未对其进行测试。

为了使该应用程序实际使用该插件,我必须在我的主机(CPP文件)中放置以下内容:
#include <QtPlugin>
Q_IMPORT_PLUGIN(qsqlpsql)

有用!另外,根据我从源代码中得出的信息,仅当动态加载插件时才检查构建 key 和版本(所有相关内容都在QLibrary的私有(private)类中,甚至不在QPluginLoader的类中)。因此,即使使用不同版本和Qt版本,生成的可执行文件也可能(或可能不取决于二进制兼容性)在Qt的版本和版本中起作用,尽管将其与较旧的版本一起使用可能会触发一些稍后修复的错误。

还值得注意的是,加载SQL驱动程序的顺序是这样的:如果可用,则使用静态链接到Qt的驱动程序,然后查找通过QSqlDatabase::registerSqlDriver()手动注册的驱动程序,然后查找静态导入到应用程序中的驱动程序(如上所述),最后尝试加载共享插件。因此,当您进行静态链接时,您的用户将无法使用他们可能已经拥有的动态链接的驱动程序,但将能够使用静态链接到Qt的驱动程序(例如在Ubuntu中)。

关于qt - 如何使Qt了解QMYSQL驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4479551/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com