嵌入式linux下移植mysql,全过程超详细超长教程

前言

先讲一下整个移植的流程,首先需要去mysql官网下载源码,然后在虚拟机环境里将源码编译并安装,生成可执行程序、头文件以及库文件,接着为了模拟测试,需要配置windows下电脑的mysql服务环境,同样的,也是去mysql官网下载windows下的安装包,配置好Windows的环境后,就可以用源码编出来的文件做模拟测试了。

有两种方法,第一种是将编出来的可执行程序和动态库放在你的开发板,然后手动连接,第二种方法是用头文件和静态库,自己写一个C语言程序连接。这两种方法都是可以实现的。

前期工作

首先下载文件

mysql源码下载,我这里使用的是mysql-5.1.72版本

Index of /sites/ftp.mysql.com/Downloads/MySQL-5.1 (mirrorservice.org)

接着下载ncurses,这个是编译mysql源码所需要的依赖,我这里使用的版本是5.9

gnu-ncurses安装包下载_开源镜像站-阿里云 (aliyun.com)

最后还要下载windows下的mysql软件包,这里下载

MySQL :: Download MySQL Community Server

编译环境

再说一下我使用的环境,可以不用和我的一样

虚拟机使用的是16.04 32位版本

Ubuntu 16.04.7 LTS (Xenial Xerus)

编译器使用的是arm-none-linux-gnueabi-gcc,使用的是2014.05-29版本

【ARM-Linux开发】arm-none-Linux-gnueabi-gcc下载安装 - ZhangPYi - 博客园 (cnblogs.com)

不会安装编译器的可以参考我这篇文章

ubuntu安装交叉编译器arm-linux-gcc_yuansec的博客-CSDN博客_ubuntu10.04安装交叉编译器arm-linux-gcc-4.3.2

mysql编译

在ubuntu下,桌面新建一个文件夹mysql,将下好的源码放在这个文件夹里

    • 编译PC版本的mysql备用

将mysql的源码解压出来,然后重命名为mysql-pc

点进mysql-pc这个文件夹,打开终端,输入一下代码进行编译

# 设置configure
./configure
# 编译
make -j4
    • 编译ncurses源码

同样,将其解压出来,然后再建一个文件夹ncurses-lib

点进ncurses-5.9这个文件夹,然后打开终端,输入以下代码进行编译

./configure --host=arm-none-linux-gnueabi --prefix=/home/lhh/桌面/ncurse-lib --enable-static
# --host=arm-none-linux-gnueabi 编译器选择
# --prefix=/home/lhh/桌面/ncurse-lib 最终生成文件的路径
# 这两个需要按照你实际的来设置
make -j4 # 编译
make install #安装

完成后会在ncurses-lib这个文件夹生成以下文件

    • 编译mysql源码

首先将mysql的源码包再解压一份出来

再建一个文件夹mysql-lib

进入源码文件夹,首先找到一个configure的文件

将其复制到windows上,然后用合适的文本编译器打开,在26303、48121、48227、48440行的位置找到以下内容

将其注释

如果位置不对的话直接查找以下内容来找

{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling

接着保存将这个文件替换掉虚拟机源码里的configure文件

然后打开终端执行以下命令

./configure --host=arm-none-linux-gnueabi --enable-static --with-named-curses-libs=/home/lhh/桌面/mysql/ncurses-lib/lib/libncurses.a --prefix=/home/lhh/桌面/mysql/mysql-lib --without-debug --without-docs --without-man --without-bench --with-charset=gb2312 --with-extra-charsets=ascii,latin1,utf8
# --host --prefix 这个按实际的来,上面讲过,这里就不解释了
# --with-named-curses-libs 这个就是之前ncurses源码编译出来的库文件

完成后不着急使用make指令,首先在当前目录下的sql文件夹中找到这个文件sql_parse.cc

同样的,将其复制出来,然后找到5636行的位置,添加代码

#define STACK_DIRECTION 1

完成后再将其复制替换到虚拟机

接着在终端执行以下代码,将之前编译的PC版的文件替换过来

cp ../mysql-pc/sql/gen_lex_hash sql/
touch -m sql/gen_lex_hash
cp ../mysql-pc/sql/lex_hash.h sql/
touch -m sql/lex_hash.h

否者make的时候会出现错误

make[2]: Leaving directory `/opt/mysql-5.5.3-m3/sql' ./gen_lex_hash > lex_hash.h-t

如果执行完以上操作还是出现这个错误,那么就再执行一遍上面的代码,再make

make没问题后,再执行

make install

最后会在mysql-lib的文件夹中生成我们所需的文件

其中可执行文件在bin目录下

头文件在incldue文件下

库文件在lib目录下

至此,mysql的源码完成编译

编译mysql源码时,如果出现其他报错信息,不一定是你的步骤错了,有可能是你虚拟机环境的问题,可能少了什么依赖,本人编译的时候也碰到过其他报错,后面百度才知道是虚拟机环境的少了一些依赖,安装即可。

windows下mysql环境配置

1.安装mysql

将我们之前下载的最新的8.0安装包解压到任意位置,我这里是放在了这个目录下

点进这个目录,新建一个文件my.ini,用记事本打开,里面添加内容

[mysqld]
basedir = D:\Program Files\mysql-8.0.31-winx64\
datadir = D:\Program Files\mysql-8.0.31-winx64\data
port =3306

然后,添加环境变量

接着用以管理员方式打开命令行

切换到mysql软件目录下的bin目录

先初始化数据库

mysqld --initialize --console

下方信息中这个是root用户的初始密码

接着安装数据库

mysqld --install

安装成功后,开启数据库服务

net start mysql

登录数据库,密码就是上面说的初始密码

mysql -u root -p

最后修改密码,将root用户的密码设置为root(可根据自己意愿设置)

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

2.开放root用户连接,使其可以通过外部连接

首先找到电脑高级防火墙设置,新建一个规则,选择端口

端口号设置为3306,也就是mysql的端口

接着一直点下一步即可

完成了以上设置后,登录上mysql,进行以下设置

# 使用mysql数据库
use mysql;
# 修改连接权限
update user set host='%' where user='root';
# 授权远程连接,这一条要执行两次,第一次执行时会报错,第二次执行可以成功
Grant all privileges on root.* to 'root'@'%';
# 更改加密方式
alter user root identified with mysql_native_password by '123456';
# 执行刷新权限
flush privileges;

模拟测试

    • 使用可执行文件测试

将之前编译好的可执行文件mysql放到arm开发板的/bin目录下,并且赋权限

chmod 777 mysql

再将库文件下的这六个文件,先进行压缩打包,再放到arm开发板的/lib目录下

最后就可以进行测试连接

mysql -h 192.168.0.13 -u root -p
# -h 192.168.0.13 电脑的以太网ip,根据你的情况设置
# -u root 连接root用户,密码就是root用户的密码
    • 使用C语言编程连接

虚拟机新建一个文件夹mysql-test,再建一个include文件夹,将之前编译好的include下的头文件全部复制到这个include文件夹里

接着把之前编译好的lib目录下的文件libmysqlclient.a,也复制到mysql-test目录下,最后新建一个c文件test.c

test.c输入以下代码

#include <stdio.h>
#include "include/mysql.h"
int main()
{
    MYSQL mysql;
    MYSQL_RES *my_res;
    MYSQL_ROW my_row;
    MYSQL_FIELD *my_field;
    
    int res,i;
    int rows;
    
    if(mysql_init(&mysql) == NULL)    //初始化句柄mysql
    {
        printf("mysql_init failure!\n");
        return 1;
    }
    printf("mysql_init!\n");
    if (mysql_library_init(0, NULL, NULL) != 0)     //初始化mysql数据库
    {
        printf("mysql_library_init failure!\n");
        return 1;
    }
    printf("mysql_library_init!\n");
    
    if (NULL == mysql_real_connect
            (&mysql,
            "192.168.0.13",
            "root",
            "root",
            "test",
            3306,
            NULL,
            0)
    )                        //与mysql服务器建立连接    
    {
        printf("mysql_real_connect failure!\n");
        return 1;
    }
    printf("mysql_real_connect!\n");
    printf("connect success!\n");
    
    if(mysql_set_character_set(&mysql, "utf8") != 0)    //设置中文字符集
    {
        printf("mysql_set_character_set failure!\n");
        return 1;
    }    
    printf("mysql_set_character_set!\n");
    if(mysql_query(&mysql, "insert into test values (3, '李四', 10)") != 0) //插入一条信息
    {
        printf("mysql_query failure!\n");
    }
    printf("mysql_query!\n");
    
    res = mysql_query(&mysql, "select * from test;");
    my_res = mysql_store_result(&mysql);
    
    rows = mysql_num_fields(my_res);
    my_field = mysql_fetch_fields(my_res);
    for(i=0; i<rows; i++)
        printf("%s\t", my_field[i].name);
    printf("\n-------------------------------------\n");

    while( 1 )//查看数据表所有信息
    {
        my_row = mysql_fetch_row(my_res);
        if( NULL == my_row )
            break;
        for(i=0; i<rows; i++)
        {
            if( my_row[i] == NULL )
                printf("NULL\t");
            else
                printf("%s\t", (char*)my_row[i]);
        }
        printf("\n");
    }

    
    mysql_close(&mysql);
    mysql_library_end();
    return 0;
}

然后打开终端,执行编译

arm-none-linux-gnueabi-gcc -o test test.c -I/include -L. -lmysqlclient -lm

最后会生成一个可执行文件test

将这个文件放到arm开发板里,然后赋权限

chmod 777 test

在执行之前先在windows下创建一个数据库test,再创建一个数据表test

# 连接数据库
mysql -u root -p
# 创建数据库test
create database test;
# 使用数据库test
use test;
# 创建数据表test
create table test
(
id INT(11),
name VARCHAR(25),
age INT(11)
);

完成后,在arm开发板执行程序

再用windows下的mysql查看表数据

可以看到数据已经成功插入,程序功能没问题。

总结

至此,整个移植功能完美实现,整个流程走下来对于linux下的编程应用也会有很大的提示,其中的难点主要就是mysql源码的编译,而且这个在网上基本找不到教程,windows下的mysql配置如果还有问题的话,可以百度,这个网上教程很多,或者可以私聊我,如果我的文章有帮助到你的话可以帮忙点个赞。

猜你喜欢

转载自blog.csdn.net/lhh2333/article/details/128559181