前言
在开发板中移植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表格中的数据读出
至此,就可以在开发板上和远程数据库进行数据的交流了