嵌入式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;
}
相关推荐
小小码农Come on1 小时前
WorkerScript处理qml多线程处理异步数据
qt
小灰灰搞电子1 小时前
Qt 中的队列解析
qt
原来是猿7 小时前
QT初识【创建项目+对象树】
开发语言·qt
-凌凌漆-8 小时前
【Qt】 QSerialPort::flush()介绍
开发语言·qt
咸鱼翻身小阿橙10 小时前
QT P4
数据库·qt·nginx
Wild_Pointer.12 小时前
项目实战:编写CMakeLists管理Qt+OpenCV项目
开发语言·c++·qt
星越华夏13 小时前
Qt5状态栏刷新显示内容
python·qt
sycmancia13 小时前
Qt——Qt中的文件操作、文本流和数据流
开发语言·qt
雾岛听蓝1 天前
Qt操作指南:窗口组成与菜单栏
开发语言·经验分享·笔记·qt
(Charon)1 天前
【C++/Qt】C++/Qt 实现 TCP Server:支持启动监听、消息收发、日志保存
c++·qt·tcp/ip