嵌入式开发工具——交叉编译libmysql

前言

在开发板中移植mysql太麻烦(就是懒) ,故将需要用到的库移植到开发板中供给C语言程序使用。
在这里插入图片描述
最终实现效果:Exynos4412开发板连接阿里云数据库

一、libmysql源码下载

1、官网下载
点击下载
在这里插入图片描述
2、百度网盘
链接失效可告知我

链接:https://pan.baidu.com/s/1AlOxQozi4TmDvlG6cxD5yA 
提取码:j052
二、解压并配置

1、将其拷贝到ubuntu中,解压,查看目录下的文件
在这里插入图片描述
2、安装cmake
里头使用cmake工具进行配置,故需要进行安装

sudo apt-get install cmake

3、配置 CMakeLists.txt
在开头加入(靠前加入)
将其中的交叉编译工具改为自己的交叉编译工具路径

SET(CMAKE_CXX_COMPILER "arm-none-linux-gnueabi-g++")
SET(CMAKE_C_COMPILER "arm-none-linux-gnueabi-gcc")

在这里插入图片描述
4、使用Cmake进行配置

cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=安装路径

在这里插入图片描述

三、编译安装

1、直接进行make
错误1

error: static declaration of 'rint' follows non-static declaration

解决方法:将include/my_global.h中的rint函数注释掉即可
在这里插入图片描述
错误2
在编译到95%的时候出现各种未定义

erro:undefined reference floor 

解决方法:在Makefile中加入一个环境变量,将这些函数链接起来即可
在这里插入图片描述
解决上面的两个问题需要重新使用cmake进行配置,再make即可编译成功。
问题解决参考博客:点击进入(也是困扰了好久,可以去看看大神的分析-.-)

2、安装
2.1、进行安装 make install,发现其并没有按照之前的配置的安装路径进行安装(竟然安装到我的mysql中去),百思不得其解
在这里插入图片描述
最后找到一个配置安装路径的文件cmake_install.cmake
发现配置的应该是 /usr/local/mysql 是默认的配置路径(明明CMAKE_INSTALL_PREFIX已经定义) 最后直接将默认路径给改成自己想要的路径并重新进行make install即可
在这里插入图片描述
在这里插入图片描述
2.2、将安装目录下的include和lib中的文件拷贝到交叉编译器对应的文件夹中去,就可以愉快地进行编译了(lib中的文件还要拷贝到开发板的文件系统中的lib,程序在开发板中运行的时候才能找到对应的库)
在这里插入图片描述

四、程序测试

1、简单写了一个数据库的连接程序 实现将test数据库中的test表格中的数据输出。
程序中的主机地址和密码被我删掉了 改成自己的数据库主机地址和数据库root密码就可以使用

#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 记录行

/*
	host
	name
	password
	db_name
	port
*/

const char *g_host_name = "";//主机地址
const char *g_user_name = "root";//数据库用户名
const char *g_password = "";//密码
const char *g_db_name = "test";//连接的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 test"))
		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\n",g_row[0]);
    mysql_free_result(g_res); // 释放结果集
	mysql_close(g_conn);
	return 0;
}

2、配置服务器端的mysql(需要配置允许远程连接)
在这里插入图片描述
3、编译
编译的时候需要加入参数 -lmysqlclient
在这里插入图片描述
4、在开发板上运行编译好的可执行文件
显示连接成功 并将test表格中的数据读出
在这里插入图片描述
至此,就可以在开发板上和远程数据库进行数据的交流了
在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值