嵌入式Qt-mysql数据库驱动移植

libmysql源码编译

1、官网下载

2、解压并配置

tar -xvf mysql-connector-c-6.0.2

3、安装cmake

sudo apt-get install cmake

4.配置CMakeLists.txt

进入解压好的文件夹

编辑CMakeLists.txt文件,添加自己的编译环境,这里用交叉编译为例,x86同理

vi CMakeLists.txt

objectivec 复制代码
#x86
#SET(CMAKE_CXX_COMPILER "g++")
#SET(CMAKE_C_COMPILER "gcc")

#arm
SET(CMAKE_CXX_COMPILER "arm-linux-gnueabihf-g++")
SET(CMAKE_C_COMPILER "arm-linux-gnueabihf-gcc")

5、进行编译

执行cmake

cmake -G "Unix Makefiles"

进入libmysql文件夹

cd libmysql/

编辑Makefile

vi Makefile

在Makefile开头添加

export LDFLAGS+=-lm

使用编译命令 make

使用 make install 安装,执行成功后,动态库文件保存在/usr/local/mysql/lib/中

6、编译Qt中自带的mysql源码

打开QT安装的源码目录

cd /home/book/qt/qt-everywhere-src-5.12.9/qtbase/src/plugins/sqldrivers/mysql

编辑mysql.pro文件 vi mysql.pro

makefile 复制代码
include(../configure.pri)

TARGET = qsqlmysql

HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp

#QMAKE_USE += mysql

OTHER_FILES += mysql.json

INCLUDEPATH += "/usr/include/mysql"
DEPENDPATH  += "/usr/include/mysql"
LIBS+=-L/usr/local/mysql/lib -lmysqlclient_r

PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)

保存并退出后,使用自己的qmake编译环境进行编译

bash 复制代码
#x86
/opt/Qt5.12.9/5.12.9/gcc_64/bin/qmake mysql.pro

#arm
/home/book/nfs_rootfs/arm-qt/bin/qmake mysql.pro

编译完成后会生成Makefile文件,执行make命令

编译成功后就会在/home/book/qt/qt-everywhere-src-5.12.9/qtbase/plugins/sqldrivers中生成libqsqlmysql.so文件

将ibqsqlmysql.so拷贝到开发板中的文件系统的对应的Qt的plugins/sqldrivers目录下

即可实现在开发板上对mysql数据库进行操作

注:若需要在c程序中驱动,则需要添加mysql的静态链接库

arm-linux-gnueabihf-gcc -o sql sql.c -L/usr/local/mysql/lib -lmysqlclient -I /usr/local/mysql/include/ -lm

示例程序:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mysql.h"

#define MAX_BUF_SIZE 1024 //缓冲区最大字节数

MYSQL *g_conn;//mysql 链接  
MYSQL_RES *g_res;//mysql 记录集  
MYSQL_ROW g_row;//字符串数组,mysql 记录行


const char *g_host_name = "";//主机地址
const char *g_user_name = "";//数据库用户名
const char *g_password = "";//密码
const char *g_db_name = "";//连接的database名字
const unsigned int g_db_port = 3306;

/*
	存放命令的缓冲区
*/
char sql[MAX_BUF_SIZE];
char Time[MAX_BUF_SIZE];

int iNum_rows = 0;//mysql语句执行结果返回行数赋初值  
int flag = 0;//管理员权限开关  
int i = 1;//系统运行开关  

/*
	打印错误函数
*/

void print_mysql_error(const char *msg)
{
	if(msg)
		printf("%s: %s\n",msg,mysql_error(g_conn));
	else
		puts(mysql_error(g_conn));
}
/*
	执行MySql语句函数
*/

int executesql(const char * sql)
{
	if(mysql_real_query(g_conn,sql,strlen(sql)))
		return -1;
	return 0;
}
/*
	初始化数据库连接
*/

int init_mysql(const char *g_host_name,const char *g_user_name,const char *g_password,const char *g_db_name,const unsigned int g_db_port)
{
	//初始化g_conn
	g_conn = mysql_init(NULL);
	//connection the database 
	if(!mysql_real_connect(g_conn,g_host_name,g_user_name,g_password,g_db_name,g_db_port,NULL,0))
		return -1;//链接失败
	return 0; //返回成功
}

int connect_db(const char *g_host_name,const char *g_user_name,const char *g_password,const char *g_db_name,const unsigned int g_db_port)
{
	if(init_mysql(g_host_name,g_user_name,g_password,g_db_name,g_db_port))
	{
		print_mysql_error(NULL);//当链接数据库时候 有错误 会报错
		return -1;
	}
	else
	{
		printf("Connect OK!\n");
		return 0;
	}
}

int main()
{
	int iNum_rows,iNum_fields,res;
	res = connect_db(g_host_name, g_user_name, g_password, g_db_name, g_db_port);
	if(res!=0)
	{
		printf("Can not connect!\n");
		return -1;	
	} 
	if(executesql("select  * from user"))
		print_mysql_error(NULL);
	g_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 
    iNum_rows = mysql_num_rows(g_res); // 得到记录的行数  
    iNum_fields = mysql_num_fields(g_res); // 得到记录的列数 
	while ((g_row=mysql_fetch_row(g_res))) // 打印结果集
      printf("%s %s %s\n",g_row[0],g_row[1],g_row[2]);

    mysql_free_result(g_res); // 释放结果集
	mysql_close(g_conn);
	return 0;
}
相关推荐
----云烟----24 分钟前
Qt获取文件夹下的文件个数(过滤和不过滤的区别)
数据库·qt
cuijian2B26 分钟前
Qt:信号槽
qt
徐霞客32012 小时前
Qt入门1——认识Qt的几个常用头文件和常用函数
开发语言·c++·笔记·qt
姆路12 小时前
QT Designer内存飙升
qt
Bruce小鬼14 小时前
QT文件基本操作
开发语言·qt
懷淰メ14 小时前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5
Mr.Q19 小时前
OpenCV和Qt坐标系不一致问题
qt·opencv
重生之我是数学王子1 天前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
----云烟----1 天前
QT中QString类的各种使用
开发语言·qt
「QT(C++)开发工程师」2 天前
【qt版本概述】
开发语言·qt