当前位置: 首页 > news >正文

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),执行效果如下:
在这里插入图片描述

相关文章:

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 如果…...

QT使用QXlsx实现数据验证与Excel公式操作 QT基础入门【Excel的操作】

准备环境:QT中使用QtXlsx库的三种方法 1、公式操作写单行公式 //右值初始化Format rAlign;rAlign.setHorizontalAlignment(Format::AlignRight);//左值初始化Format lAlign;lAlign.setHorizontalAlignment(Format::AlignLeft);xlsx.write("B3", 40, lAlign);xlsx.wr…...

renrenfast Vue2 打包发布

1、修改 static/config/index-prod.js 文件 // api接口请求地址 window.SITE_CONFIG[baseUrl] http://192.168.1.86:8080/renren-fast; /*** 生产环境*/ ;(function () {window.SITE_CONFIG {};// api接口请求地址window.SITE_CONFIG[baseUrl] http://192.16…...

NoSQL数据库介绍+Redis部署

目录 一、NoSQL概述 1、数据的高并发读写 2、海量数据的高效率存储和访问 3、数据库的高扩展和高可用 二、NoSQL的类别 1、键值存储数据库 2、列存储数据库 3、文档型数据库 4、图形化数据库 三、分布式数据库中的CAP原理 1、传统的ACID 1&#xff09;、A--原子性 …...

【mindspore学习】环境配置

本次实验搭配的环境是 CUDA 11.6 CUDNN v8.9.4 TensorRT-8.4.1.5 mindspore 2.1.0。 1、配置 Nvidia 显卡驱动 如果原来的主机已经安装了 nvidia 驱动&#xff0c;为避免版本的冲突&#xff0c;建议先清除掉旧的 nvidia驱动 sudo apt-get --purge remove nvidia* sudo apt…...

基于shell脚本对aliyun npm仓库(https://packages.aliyun.com)登录认证

文章目录 基于shell脚本对阿里云npm仓库&#xff08;https://packages.aliyun.com&#xff09;登录认证食用人群食用方式 基于shell脚本对阿里云npm仓库&#xff08;https://packages.aliyun.com&#xff09;登录认证 食用人群 由于一些安全的原因&#xff0c;某些企业可能会…...

K8s Pod 安全认知:从openshift SCC 到 PSP 弃用以及现在的 PSA

写在前面 简单整理,博文内容涉及: PSP 的由来PSA 的发展PSA 使用认知不涉及使用,用于了解 Pod 安全 API 资源理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是…...

提高企业会计效率,选择Manager for Mac(企业会计软件)

作为一家企业&#xff0c;良好的财务管理是保持业务运转的关键。而选择一款适合自己企业的会计软件&#xff0c;能够帮助提高会计效率、减少错误和节约时间。在众多的选择中&#xff0c;Manager for Mac(企业会计软件)是一款值得考虑的优秀软件。 首先&#xff0c;Manager for…...

软考:中级软件设计师:信息系统的安全属性,对称加密和非对称加密,信息摘要,数字签名技术,数字信封与PGP

软考&#xff1a;中级软件设计师:信息系统的安全属性 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准…...

Vue3中reactive响应式失效的问题

情景阐述 弹窗内部有一个挑选框&#xff0c;要通过请求接口获取挑选框下面可供选择的数据。 这是一个很简单的情境&#xff0c;我立刻有了自己的思路。如果实现搜索&#xff0c;数据较少可以直接用elementplus自带的filter。如果数据较多&#xff0c;就需要传val&#xff0c;…...

lamp

LAMP 环境 指的是在 Linux 操作系统中分别安装 Apache 网页服务器、MySQL 数据库服务器和 PHP 开发服务器&#xff0c;以及一些对应的扩展软件。AMP也支持win操作系统 &#xff08;sccm 域升级版&#xff09; LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同…...

LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…...

Qt 自定义菜单 托盘菜单

托盘菜单实现&#xff1a;通过QSystemTrayIconQMenuQAction即可完美实现&#xff01; 实现方式&#xff1a;createActions用于创建菜单、菜单项,translateActions用于设置文本、实现多语化&#xff0c;translateAccount用于设置用户空间配额。 void TrayMenu::createActions(…...

channel并发编程

不要通过共享内存通信&#xff0c;要通过通信共享内存。 channel是golang并发编程中一种重要的数据结构&#xff0c;用于多个goroutine之间进行通信。 我们通常可以把channel想象成一个传送带&#xff0c;将goroutine想象成传送带周边的人&#xff0c;一个传送带的上游放上物品…...

苹果新健康专利:利用 iPhone、Apple Watch 来分析佩戴者的呼吸情况

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果获得了一项健康相关的技术专利&#xff0c;可以利用 iPhone、Apple Watch 来分析佩戴者的呼吸系统。 苹果在专利中概述了一种测量用户呼吸功能的系统&#xff0c;通过 iPhone 上的光学感测单元&am…...

数据分析基础-数据可视化02-不同数据类型的可视化概念及原则

将数据空间映射到颜色空间。 数据空间&#xff1a;连续或分类 数据可以被划分为两个主要的数据空间&#xff1a;连续数据和分类数据。这两种数据空间有不同的特点和适用的分析方法。 连续数据&#xff08;Continuous Data&#xff09;&#xff1a; 连续数据是指可以在某个范…...

QT项目使用Qss的总结

什么是QSS QSS称为Qt Style Sheets也就是Qt样式表&#xff0c;它是Qt提供的一种用来自定义控件外观的机制。QSS大量参考了CSS的内容&#xff0c;只不过QSS的功能比CSS要弱很多&#xff0c;体现在选择器要少&#xff0c;可以使用的QSS属性也要少很多&#xff0c;并且并不是所有…...

suricata初体验+wireshark流量分析

目录 一、suricata介绍 1.下载安装 2.如何使用-攻击模拟 二、wireshark流量分析 1.wireshark过滤器使用 2.wireshark其他使用 一、suricata介绍 1.下载安装 通过官网下载suricata&#xff0c;根据官网步骤进行安装。 官网地址&#xff1a; https://documentation.wazuh.…...

机器学习:异常检测实战

文章目录 Anomaly Detection目录任务介绍数据集方法评估Baseline报告报告评价标准 Anomaly Detection 目录 任务介绍 无监督的异常检测 数据集 方法 autoencode 是否能够还原出原始类型图片&#xff0c;基于重构loss来判断是否正常 重构误差当作异常分数 评估 采用ROC和AUC…...

数据结构1

数据结构是计算机科学中存储和组织数据的一种方式&#xff0c;它定义了数据的表示方式和对数据进行操作的方法&#xff0c;常见的数据结构包括数组、栈、链表、队列、树、图等。 目录 一、常见的数据结构 1.数组 2.栈 3.队列 4.链表 5.树 6.图 一、常见的数据结构 1.数…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...