QT学习笔记-开发环境编译Qt MySql数据库驱动与交叉编译Qt MySql数据库驱动

QT学习笔记-开发环境编译Qt MySql数据库驱动与交叉编译Qt MySql数据库驱动

  • 0、背景
  • 1、基本环境
  • [2、开发环境编译Qt MySql数据库驱动](#2、开发环境编译Qt MySql数据库驱动)
    • [2.1 依赖说明](#2.1 依赖说明)
    • [2.2 MySQL驱动编译过程](#2.2 MySQL驱动编译过程)
  • [3、交叉编译Qt MySql数据库驱动](#3、交叉编译Qt MySql数据库驱动)
    • [3.1 依赖说明](#3.1 依赖说明)
      • [3.3.1 如何在交叉编译服务器上找到mysql.h及相关头文件](#3.3.1 如何在交叉编译服务器上找到mysql.h及相关头文件)
      • [3.3.2 如果在交叉编译服务器上获得目标系统(ARM版本)的libmysqlclient.so库](#3.3.2 如果在交叉编译服务器上获得目标系统(ARM版本)的libmysqlclient.so库)
    • [3.2 MySQL驱动交叉编译过程](#3.2 MySQL驱动交叉编译过程)
  • 4、把数据库驱动部署到目标系统中
  • 5、QT测试程序访问MySQL数据库
    • [5.1 关键代码](#5.1 关键代码)
    • [5.2 执行结果](#5.2 执行结果)

0、背景

如果需要在QT程序中实现与MySQL数据库的交互,那么必不可少的一环就是对Qt MySql数据库驱动的编译。

1、基本环境

操作系统:Windows10 专业版 64位

Qt版本:Qt 5.15.2

开发环境Qt安装路径:D:\Qt

交叉编译服务器:Ubuntu 18.4

交叉编译服务器Qt安装路径:/opt/Qt

目标芯片:rk3568

目标平台:arm64

Qt安装时需要勾选安装源码,否则是无法找到Qt的数据库驱动源码的。

2、开发环境编译Qt MySql数据库驱动

2.1 依赖说明

  • mysql.h及相关头文件
  • libmysql.lib

因为在编译Qt MySql驱动源码是需要依赖libmysql.lib和mysql.h头文件,在开发环境中(Windows)我们可以通过安装MySql服务

开发环境中MySQL的安装说明:

版本:5.7

安装目录:C:\Program Files\MySQL\MySQL Server 5.7

libmysql.lib所在目录:C:\Program Files\MySQL\MySQL Server 5.7\lib

mysql.h及相关头文件所在目录:C:\Program Files\MySQL\MySQL Server 5.7\include

2.2 MySQL驱动编译过程

1、驱动源码目录:D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql

2、在Windows的开始菜单中找到Qt5.15.2(MinGW 8.1.0 64-bit)命令行工具

3、切换到mysql驱动源码目录下:D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql,然后分别执行以下命令

qmake "INCLUDEPATH+='C:\Program Files\MySQL\MySQL Server 5.7\include'" "LIBS+='C:\Program Files\MySQL\MySQL Server 5.7\lib\libmysql.lib'" -o Makefile mysql.pro

mingw32-make

cmd 复制代码
qmake "INCLUDEPATH+='C:\Program Files\MySQL\MySQL Server 5.7\include'" "LIBS+='C:\Program Files\MySQL\MySQL Server 5.7\lib\libmysql.lib'" -o Makefile mysql.pro
mingw32-make

4、编译后的输出目录:D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\plugins\sqldrivers

5、把编译后的输出文件libqsqlmysql.a、qsqlmysql.dll、qsqlmysql.dll.debug复制到D:\Qt\5.15.2\mingw81_64\plugins\sqldrivers目录下

6、编译项目需默认引用的目录:D:\Qt\5.15.2\mingw81_64\plugins\sqldrivers

7、要把对应的dll复制到C:\Windows目录下:libmysql.dll

3、交叉编译Qt MySql数据库驱动

3.1 依赖说明

  • mysql.h及相关头文件
  • libmysqlclient.so(注意是目标系统的库-arm版本的库)

3.3.1 如何在交叉编译服务器上找到mysql.h及相关头文件

1、我的交叉编译服务器用的就是构建目标linux操作系统的编译服务器(ubuntu18.4),可以通过安装libmysqlclient-dev 软件包获取mysql.h及相关头文件。

2、首先切换到root用户

cmd 复制代码
sudo -i

输入root用户的密码后就切换到root用户了

3、然后执行以下命令(如果未切换到root用户,则前面加上sudo)

cmd 复制代码
apt-get upgrade
apt-get install -y libmysqlclient-dev

如下图:

4、安装完毕后就可以在/usr/include/mysql目录下找到mysql.h及相关头文件了,如下图:

3.3.2 如果在交叉编译服务器上获得目标系统(ARM版本)的libmysqlclient.so库

1、在3.3.1中安装libmysqlclient-dev后,也会在/usr/lib/x86_64-linux-gnu目录下部署libmysqlclient.so,但是这个文件不是arm版本的,因此在交叉编译qt mysql驱动时,是不能引用这个库的。如下图:

2、因为我的交叉编译服务器就是用的构建linux操作系统的编译服务器,因此在构建目标操作系统时,可以通过buildroot的menuconfig勾选mysql的支持以生成arm版本的libmysqlclient.so,如下图:

3、勾选mysql support后重新构建目标操作系统后,在buildroot的输出目录下的target/usr/lib目录下就包含arm版本的libmysqlclient.so了,如下图:

3.2 MySQL驱动交叉编译过程

1、我们知道Qt开发的源码,要生成可执行程序一般要通过2个步骤:

  1. 通过qmake生成Makefile
  2. 通过make对源码进行编译生成动态库和可执行程序
    交叉编译的思路:首先我们要明白在开发环境中安装qt时自带的qmake是不能作为交叉编译用的,因为他生成的Makefile中所采用的gcc和g++编译器都是对应x86和windows的。再就是我们如果再交叉编译服务器(X86/Linux)上直接安装Linux版本的qt的话,这个qt自带的qmake也不能作为交叉编译用,因为他生成的Makefile中所采用的gcc和g++编译器都是对应x86和Linux的。因此我们首先要找到对应目标系统(Arm/Linux)的qmake才行。

2、我是通过buildroot构建目标操作系统的,因为要在目标系统中运行qt的程序,因此在构建过程中要把qt的环境编译到目标系统中,构建完毕后会在buildroot目录下生成output目标,我们可以采用这下面的qmake生成采用交叉编译器的Makefile,如下:

qmake的目录为:SDK/buildroot/output/rockchip_rk3568/host/bin/qmake

其中SDK表示编译目标Linux系统的源码目录

rockchip_rk3568对应的是芯片型号

3、我们先把qt源码部署到交叉编译环境中,如下:

4、通过vim修改mysql.pro工程文件内容,注释掉QMAKE_USE += mysql,如下:

然后按ESC,输入wq保存退出。

5、然后我们使用SDK/buildroot/output/rockchip_rk3568/host/bin/qmake生成Makefile,同时要执行包含mysql.h及相关头文件所在的目录且依赖的libmysqlclient.so库的路径,如下:

SDK/buildroot/output/rockchip_rk3568/host/bin/qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=SDK/buildroot/output/rockchip_rk3568/target/usr/lib/libmysqlclient.so" -o Makefile mysql.pro

其中SDK表示编译目标Linux系统的源码目录

rockchip_rk3568对应的是芯片型号

SDK/buildroot/output/rockchip_rk3568/target/usr/lib/libmyqlclient.so文件是通过交叉编译工具对libmysqlclient-dev源码编译生成的针对目标系统(Arm/Linux)的库文件。

6、看一下Makfile的内容:

可以看到,这里的Makefile中指定的gcc/g++编译工具就是交叉编译工具,就是能生成Arm/Linux能运行的。

具体目录为:

SDK/buildroot/output/rockchip_rk3568/host/bin/aarch64-buildroot-linux-gnu-gcc

SDK/buildroot/output/rockchip_rk3568/host/bin/aarch64-buildroot-linux-gnu-g++

其中SDK表示编译目标Linux系统的源码目录

rockchip_rk3568对应的是芯片型号。

7、这时,再执行make就会采用交叉编译工具aarch64-buildroot-linux-gnu-gcc和aarch64-buildroot-linux-gnu-g++进行编译了,

编译完毕后,会生成libqsqlmysql.so,如下图:

目录:QtSrc/qtbase/src/plugins/sqldrivers/plugins/sqldrivers

其中QtSrc表示Qt的源码目录。

至此终于生成了支持目标系统(Arm/Linux)能够识别的数据库驱动库libqsqlmysql.so

4、把数据库驱动部署到目标系统中

1、首先通过MobaXterm以SSH方式连接到目标系统(开发板系统)。

2、在/usr/lib/qt/plugins目录下创建目录sqldrivers。

3、把在交叉编译服务器中生成的QtSrc/qtbase/src/plugins/sqldrivers/plugins/sqldrivers/libqsqlmysql.so文件传到目标系统的/usr/lib/qt/plugins/sqldrivers目录下,如下:

至此,目标系统就支持Qt程序对postgresql数据库的访问了。

5、QT测试程序访问MySQL数据库

5.1 关键代码

c 复制代码
void Widget::on_btnDbTest_clicked()
{
    //以下代码测试访问MySQL数据
    QSqlDatabase  db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("xxx.xxx.xxx.xxx");		//数据库服务器的ip
    db.setPort(3306);						//数据库服务器的端口号
    db.setDatabaseName("mydbname");    //此处写你数据库的名称
    db.setUserName("root");			//写mysql数据库的用户名
    db.setPassword("root@123");			//写mysql数据库的密码

    if (!db.open())
    {
        qDebug() << "数据库连接失败!";
        QSqlError lastError = db.lastError();
        qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();
    }
    else
    {
        qDebug() << "数据库连接成功!";
        QSqlQuery query(db);
        if (query.exec("select * from sys_user"))
        {
            qDebug() << "查询表格UserInfo成功!";
            while(query.next())
            {
                qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();
            }
        }
    }
}

5.2 执行结果

把上面的qt程序交叉编译后放入目标系统(arm),执行效果如下:

相关推荐
chenzhou__4 分钟前
LinuxC语言文件i/o笔记(第十七天)
linux·c语言·笔记·学习
chenzhou__7 分钟前
LinuxC语言文件i/o笔记(第十八天)
linux·c语言·笔记·学习
蓝天智能14 分钟前
Qt 的字节序转换
开发语言·qt
Nuyoah11klay28 分钟前
华清远见25072班单片机高级学习day1
单片机·嵌入式硬件·学习
Apache IoTDB34 分钟前
时序数据库 IoTDB 集成 MyBatisPlus,告别复杂编码,简化时序数据 ORM 开发
数据库·struts·servlet·时序数据库·iotdb
isNotNullX1 小时前
怎么用数据仓库来进行数据治理?
大数据·数据库·数据仓库·数据治理
小坏讲微服务1 小时前
Spring Cloud Alibaba Gateway 集成 Redis 限流的完整配置
数据库·redis·分布式·后端·spring cloud·架构·gateway
霜绛1 小时前
Unity:lua热更新(一)——AB包AssetBundle、Lua语法
笔记·学习·游戏·unity·lua
霜绛1 小时前
Unity:lua热更新(二)——Lua语法(续)
笔记·学习·unity·游戏引擎·lua
HitpointNetSuite2 小时前
连锁餐饮行业ERP系统如何选择?
大数据·数据库·oracle·netsuite·erp