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

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

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

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用户

sudo -i

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

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 关键代码

void Widget::on_btnDbTest_clicked()
{//以下代码测试访问MySQL数据QSqlDatabase  db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("xxx.xxx.xxx.xxx");		//数据库服务器的ipdb.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),执行效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/108556.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保姆级 Keras 实现 Faster R-CNN 十

保姆级 Keras 实现 Faster R-CNN 十 一. 建议区域矩形二. 定义 ProposalLyaer1. __init__函数2. build 函数3. call 函数3.1 生成 anchor_box3.2 找出 anchor 处最大分数, 最大分数对应的 anchor_box 和修正参数3. 3 修正 anchor_box3.4 完成 call 函数 4. compute_output_shap…

二级MySQL(九)——表格数据处理练习

在Mysql中&#xff0c;可以用INSERT或【REPLACE】语句&#xff0c;向数据库中已一个已有的表中插入一行或多行记录。 在Mysql中&#xff0c;可以用【DELETE】或【TRUNCATE】语句删除表中的所有记录。 在Mysql中&#xff0c;可以用【UPDATE】语句来修改数据表中的记录。 为了完…

windows系统 Fooocus 图片生成模型 ,4-6GB显存即可玩,27S/p

安装步骤: 1.下载程序代码框架,大小2GB ,下载 ​​​​​​https://github.com/lllyasviel/Fooocus/releases/download/1.0.35/Fooocus_win64_1-1-1035.7z 2.下载模型文件sd_xl_base_1.0_0.9vae.safetensors ,大小6GBhttps://huggingface.co/stabilityai/stable-diffusion-x…

[完美解决]Vue项目运行时出现this[kHandle] = new _Hash(algorithm, xofLen)

vue项目运行bug解决办法 一、问题内容二、问题出现的原因三、解决方法1、方法一(推荐)2、方法二(可以解决&#xff0c;但不太推荐) 一、问题内容 在github寻找一些vue项目clone到本地时候&#xff0c;npm i没有问题&#xff0c;但是npm run serve 或者npm run dev的时候会出现…

【mq】如何保证消息可靠性

文章目录 mq由哪几部分组成rocketmqkafka 为什么需要这几部分nameserver/zookeeper可靠性 broker可靠性 生产者消费者 mq由哪几部分组成 rocketmq kafka 这里先不讨论Kafka Raft模式 比较一下&#xff0c;kafka的结构和rocketmq的机构基本上一样&#xff0c;都需要一个注册…

计算机竞赛 基于GRU的 电影评论情感分析 - python 深度学习 情感分类

文章目录 1 前言1.1 项目介绍 2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测 5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于GRU的 电影评论情感分析 该项目较为新颖&#xff0c;适合作为竞…

Postman中参数区别及使用说明

一、Params与Body 二者区别在于请求参数在http协议中位置不一样。Params 它会将参数放入url中以&#xff1f;区分以&拼接Body则是将请求参数放在请求体中 后端接受数据: 二、body中不同格式 2.1 multipart/form-data key - value 格式输入&#xff0c;主要特点是可以上…

(三)行为模式:5、中介者模式(Mediator Pattern)(C++示例)

目录 1、中介者模式&#xff08;Mediator Pattern&#xff09;含义 2、中介者模式的UML图学习 3、中介者模式的应用场景 4、中介者模式的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 5、C实现中介者模式的实例 1、中介者模式&#xff08;Media…

基于unity的轻量配置工具开发

工具结构&#xff1a;针对每张表格生成一个表格类&#xff0c;其中默认包含一个list和字典类型参数记录表格数据&#xff0c;初始化项目时将list中的数据转为按id索引的dictionary&#xff0c;用于访问数据。额外包含一个同名Temp后缀的类&#xff0c;记录表格的字段、备注等信…

Leetcode:238. 除自身以外数组的乘积【题解超详细】

纯C语言实现&#xff08;小白也能看明白&#xff09; 题目 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数…

Apache Poi 实现Excel多级联动下拉框

由于最近做的功能&#xff0c;需要将接口返回的数据列表&#xff0c;输出到excel中&#xff0c;以供后续导入&#xff0c;且网上现有的封装&#xff0c;使用起来都较为麻烦&#xff0c;故参考已有做法封装了工具类。 使用apache poi实现excel联动下拉框思路 创建隐藏单元格&a…

计算机组成原理学习笔记-精简复习版

一、计算机系统概述 计算机系统硬件软件 计算机硬件的发展&#xff1a; 第一代计算机&#xff1a;(使用电子管)第二代计算机&#xff1a;(使用晶体管)第三代计算机&#xff1a;(使用较小规模的集成电路)第四代计算机&#xff1a;(使用较大规模的集成电路) 冯诺依曼体系结构…

指针C语言

1指针方式 1.int a,*p&a; 2. int a;int *p&a;特点&#xff1a; 1.指针变量与类型无关&#xff0c;在TC占2字节&#xff0c;在VC下占四字节 2.指针变量的引用 1.直接引用 2.间接引用 注意*的运算对象必须为地址 *p1; //相当于取p指针指向的值然后&#xff0b;1 int …

keepalived+lvs(DR)

目录 一&#xff0c;作用 二&#xff0c;调度器配置 1&#xff0c;安装keepalived 2&#xff0c; 安装ipvsadm 3&#xff0c; 配置keepalived 4. 查看lvs节点状态 5&#xff0c; web节点配置 1.1 调整ARP参数 1.2 配置虚拟IP地址 1.3添加回环路由 1.4安装nginx并写…

机器学习实战之模型的解释性:Scikit-Learn的SHAP和LIME库详解

引言&#xff1a;机器学习模型的“黑箱”困境 机器学习模型的崛起让我们惊叹不已&#xff01;不论是预测房价、识别图片中的猫狗&#xff0c;还是推荐给你喜欢的音乐&#xff0c;这些模型都表现得非常出色。但是&#xff0c;有没有想过&#xff0c;这些模型到底是如何做出这些决…

echarts 甘特图一组显示多组数据

<template><el-button type"primary" click"addlin">添加线</el-button><el-button type"success" click"addArea">添加区域</el-button><div ref"echart" id"echart" class&qu…

自学设计模式(类图、设计原则、单例模式 - 饿汉/懒汉)

设计模式需要用到面向对象的三大特性——封装、继承、多态&#xff08;同名函数具有不同的状态&#xff09; UML类图 eg.—— 描述类之间的关系&#xff08;设计程序之间画类图&#xff09; : public; #: protected; -: private; 下划线: static 属性名:类型&#xff08;默认值…

Linux(基础IO、文件权限、Makefile)

目录 1、man 手册 1.1 汉化 1.2 具体使用 2、文件权限 2.1 权限理解 2.2 文件详细信息查询 2.3 权限更改 3、常用函数接口 3.1 open 3.2 read 3.3 write 3.4 close 3.5 函数使用示例 4、make与Makefile 4.1 make 与 Makefile区别 4.2 Makefile的编写 5、vim简…

Git 原理与使用

1.版本控制器 所谓的版本控制器&#xff0c;就是能让你了解到⼀个⽂件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&#xff0c;同时也⽅便多⼈协同作业。 ⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑…

四、Kafka Broker

4.1.1 Zookeeper 存储的 Kafka 信息 4.1.2 Kafka Broker 总体工作流程 4.2 生产经验 - 节点的服役和退役 自己的理解&#xff1a;其实就是将kafka的分区&#xff0c;负载到集群中的各个节点上。 1、服役新节点 2、退役旧节点 4.3 kafka副本 1、副本的作用 2、Leader的选…