QSqlDatabase:未加载驱动程序,来自另一个 dll

Posted

技术标签:

【中文标题】QSqlDatabase:未加载驱动程序,来自另一个 dll【英文标题】:QSqlDatabase: driver not loaded, from within another dll 【发布时间】:2017-07-13 13:27:35 【问题描述】:

互联网上有大量关于驱动程序加载失败的查询,但我的情况看起来很独特。请帮忙。

我创建了我的代码的 dll,它使用 QSqlDatabase。所以依赖就像 mylib.dll->qt5sql.dll->qsqlpsql.dll 当我使用 mylib.dll 运行测试应用程序时,它无法加载驱动程序。它列出了可用的驱动程序,如下所示: QSqlDatabase:可用驱动程序:QSQLITE Qmysql QMYSQL3 QODBC QODBC3 QPSQL QPSQL7

但是,当我尝试将我的代码用作静态库时,它工作得非常好。所以对 libpq.dll 的依赖,PATH 等的值都可以。有没有其他人遇到过这样的问题?

【问题讨论】:

这三个 dll 是否与文本应用程序可执行文件位于同一文件夹中? 这方面我尝试了多种组合。 1.将exe和所有dll(包括qt5core和qt5sql)复制到同一个文件夹中。 2.exe和plugins/sqldrivers/driverdlls 3.exe和sqldrivers/driverdlls 4.qt的默认安装。我也使用过 QCoreApplication::addLibraryPath("./plugins");但它只能在我的代码的 dll 之外工作。它没有任何效果。甚至为此尝试了 setLibraryPath()。 您可以尝试另一件事: 1. 将驱动程序放入可执行文件附近的sqldrivers 文件夹 2. 通过QCoreApplication::addLibraryPathsqldrivers 文件夹添加到库路径。 3.在代码中使用之前尝试手动加载驱动:QPluginLoader loader("sqldrivers/qsqlpsql.dll"); loader.load(); 谢谢德米特里。正如您在我的分析器中看到的那样,我的问题是另外一回事。但是,您的提示有时会对其他人有所帮助。 【参考方案1】:

我发现这不是 QT 的问题,而是我的 DLL 中的问题,因为我的源代码中使用了静态变量。正如我们所知,如果静态变量不是 DLL 代码的一部分,则会在运行时创建两个不同的静态变量实例(每个用于 exe 和 DLL)。我有一个包含这些静态变量的静态库。链接此静态库以创建 DLL。所以基本上驱动程序名称没有被传递给 DLL,从而导致“驱动程序未加载”错误。我通过消除静态库的创建解决了这个问题。现在正在一起构建源代码以创建 DLL。

【讨论】:

请问如何“消除静态库创建”? 您的问题非常简短且不清楚。检查编译器标志以避免创建静态库。 CMake 和其他工具提供了自己的方式。有足够的信息可用。

以上是关于QSqlDatabase:未加载驱动程序,来自另一个 dll的主要内容,如果未能解决你的问题,请参考以下文章

找到但未加载的 MYSQL 驱动程序

未加载 QMYSQL 驱动程序,尝试了所有提示

Qt 驱动程序 Postgresql 可用但未加载

Qt5、C++:未加载 QMYSQL 驱动程序

QMYSQL 可用但无法加载

Qt5 MYSQL驱动未加载错误