热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QMYSQLdrivernotloaded原理及解决方案

分析QMYSQLdrivernotloaded基本原理,并提供详细的解决方案,且支持

1

基本原理


Qt 中有一个典型的 MySql 驱动问题,不出意外的话,只要使用 MySql 数据库,就一定会遇到:


QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7




基本原理:Qt 在操作 MySql 时,会尝试加载对应的插件(即:qsqlmysql.dll 和 qsqlmysqld.dll),但由于这些插件依赖于 MySql 的库(即:libmysql.dll),所以当找不到插件或者对应的 MySql 库时,就会加载失败!




为了测试 MySql 数据库连接,我们提供了一个简单的示例程序(配置按需更改):


#include 
#include 
#include 

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("192.168.***.***");
    db.setDatabaseName("test");
    db.setUserName("root");
    db.setPassword("password");
    db.setPort(3306);
    if (db.open()) {
        qDebug() << "Open successfully.";
        db.close();
    } else {
        qDebug() << "Open failed.";
    }

    return a.exec();
}


下面我们来详细讲解一下,究竟该如何解决上述的 MySql 驱动加载问题?



2

查找 MySql 驱动


在 5.12 及之前的版本中,Qt 的安装包中自带 MySql 驱动,在 plugins/sqldrivers 目录下可以找到:  



但到了 5.13 之后,MySql 驱动便没有了,这时我们可以选择手动编译。



3

编译 MySql 驱动


要编译 MySql 驱动,有两个前提条件:


  • 在安装 Qt 时,要一并安装源码(勾选“Sources”组件)。

  • 需要下载 MySql,编译源码时需要用到。


假设 Qt 源码已经安装了,现在进入 MySql 下载页面(见:https://dev.mysql.com/downloads/mysql/),选择合适的版本进行下载:



这里我下载的是最新版本(目前为止是 8.0.19),如果要下载其他的版本,可以选择“Archives”。


解压缩下载的安装包,其目录结构如下所示:



这里的“include”和“lib”目录比较重要,它们分别包含了 MySql 的头文件以及相应的库文件,在编译 MySql 驱动时需要用到。


现在进入 Qt 的 MySql 数据库驱动源码目录(例如:C:\SoftWare\Qt\Qt5.12.3\5.12.3\Src\qtbase\src\plugins\sqldrivers\mysql),打开 mysql.pro,并进行如下更改:



然后进行编译,完成之后,在输出目录下就会生成对应的驱动了:




4

查找依赖


MySql 的库(libmysql.dll)有了,驱动(qsqlmysql.dll 和 qsqlmysqld.dll)也有了,将他们拷贝到程序所在目录,就能正常运行啦?哈哈 O(∩_∩)O,可别高兴的太早哦!


理论上确实如此,但对于高版本的 MySql 来说不行,因为 libmysql.dll 还依赖于其他的库。所以如果按照上述做法,还是会出现“QMYSQL driver not loaded”这样的问题!(很多人被里这坑了,怎么都想不明白)


不信的话,用 Dependencies(见:https://github.com/lucasg/Dependencies)查看一下,是不是有很多依赖的库找不到:



了解之后,现在将这些库文件拷贝到程序所在目录,然后运行程序:



Perfect ,非常完美!


·END·
 

高效程序员

谈天 · 说地 · 侃代码 · 开车

长按识别二维码,解锁更多精彩内容



推荐阅读
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • OCI连接MySQL_PLSQL Developer连接远程数据库OCI客户端安装方法
    本文介绍了使用OCI客户端连接MySQL和PLSQL Developer连接远程数据库的安装方法,避免了在本地安装Oracle数据库或类似的开发套件的麻烦,同时解决了PLSQL Dev连接远程Oracle时的配置问题。 ... [详细]
  • 本文介绍了连接库的定义和使用方法。连接库是通过编译生成的dll文件,例如php_mysql.dll。在使用扩展时,需要去掉配置文件中的分号,并通过phpinfo查看是否正确加载了mysql连接库。详细内容请参考链接:https://www.cnblogs.com/xiaobiaomei/p/7654750.html。摘要字数:180字。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
author-avatar
MR张尉诚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有