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;
}