嵌入式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;
}
相关推荐
刺客xs7 小时前
Qt ----- QT线程
开发语言·qt
SunkingYang9 小时前
QT程序如何将事件和消息发送给MFC程序,MFC程序如何接收消息和事件
qt·mfc·消息·事件·通信·通讯·传递
凯子坚持 c11 小时前
Qt 5.14.0 入门框架开发全流程深度解析
开发语言·qt
深蓝海拓11 小时前
PySide6从0开始学习的笔记(十四)创建一个简单的实用UI项目
开发语言·笔记·python·qt·学习·ui·pyqt
小尧嵌入式12 小时前
Linux网络介绍网络编程和数据库
linux·运维·服务器·网络·数据库·qt·php
海涛高软13 小时前
Qt中使用QListWidget列表
开发语言·qt
010米粉01013 小时前
Qt之构建方式
qt
凯子坚持 c13 小时前
Qt 信号与槽机制深度解析
开发语言·qt
世转神风-14 小时前
qt-初步编译运行报错-When executing step “Make“-无法启动进程“make“
开发语言·qt
一然明月1 天前
QT之基础控件
开发语言·qt