前言背景:
考虑到mysql5.1版本以后编译需要通过cmake,而mysql5.1之前的版本通过./configure就可以,所以这次mysql交叉编译就选择5.1以后的版本5.7.27。由于需要使用交叉编译以后生成的动态库和静态库以及头文件,所以需要使用带有boost的源码包。进入正题:
编译环境:
Ubuntu16.04 64位
交叉编译平台:(海思)
aarch64-himix200-linux
交叉编译工具链:
aarch64-himix200-linux-gcc aarch64-himix200-linux-g++
交叉编译依赖的库,工具:
Ncurse-6.1
没有cmake工具的需要更新cmake工具:
Apt-get install cmake
特别注意:
由于编译出来的文件比较大,编译之前先预留15G的空间,防止编译过程中因为内存不足编译出错。
开始步骤:
废话不多说直接开始按步骤操作:
1、下载mysql版本mysql-boost.5.7.27.tar.gz:
下载地址:MySQL :: Download MySQL Community Server
因为移植过程中会需要用到x86环境下生成的工具,所以先编译PC端的mysql。
1.1 tar -xf mysql-boost-5.7.27.tar.gz
1.2 cd mysql-5.7.27/
1.3 cd BUILD/
1.4 vi compile-pentium64修改参数为(../boost表示上一级目录必须要有boost目录,所以下载源码的时候一定要下载带有boost的源码。或者自行指定有boost的目录也可)
1.5 ./compile-pentinum64
报错如下,根据提示安装需要的工具:
Apt-get install libncurses5-dev
执行完以后继续./compile-pentinum64
等待编译完成即可。
PC端编译完成
1.6 修改pc编译目录:
Cd ../../
mv mysql-5.7.27 mysql-5.7.27-pc
2.0 交叉编译ncurses-6.1(6.1以下的版本可能不支持aarch64交叉编译)
2.1 下载ncurses-6.1.tar.gz 下载连接:http://mirrors.ustc.edu.cn/gnu/ncurses/
2.2 解压tar包:
tar -xf ncurses-6.1.tar.gz
2.3 cd ncurses-6.1/
2.4 配置:
./configure --host=aarch64-himix200-linux --prefix=/usr/local/ncurses-6.1-arm CC=aarch64-himix200-linux-gcc CXX=aarch64-himix200-linux-g++
2.5 编译:
Make
2.6 安装:
make install DESTDIR=/usr/local/ncurses-6.1-arm_install
编译最后会报strip的错误,这个不用理会,strip只是剔除一写无关紧要的信息,编译完只要保证安装目录lib下有静态库.a生成即可。
3.0 mysql的交叉编译
3.1重新解压mysql-boost.5.7.27.tar.gz:
tar -xf mysql-boost-5.7.27.tar.gz
3.2 cd mysql-5.7.27
3.3 mkdir BUILD_ARM
3.4 cd BUILD_ARM
3.5 vi compile-arm
#! /bin/sh
path='dirname $0'
cmake .. -DWITH_DEBUG=0 -DSTACK_DIRECTION=1 -DENABLE_DOWNLOADS=1 -DDOWNLOAD_BOOST=1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATIOIN=utf8_general_ci -DEXTRA_CHARSETS=all -DENABLED_LOCAL_INFILE=1 -DWITH_BOOST=../boost -DCMAKE_CXX_COMPILER=aarch64-himix200-linux-g++ -DCMAKE_C_COMPILER=aarch64-himix200-linux-gcc -DCURSES_INCLUDE_PATH=/usr/local/ncurses-6.1-arm_install/usr/local/ncurses-6.1-arm/include -DCURSES_LIBRARY=/usr/local/ncurses-6.1-arm_install/usr/local/ncurses-6.1-arm/lib/libncurses.a
3.6 chmod 755 ./compile-arm
3.7 ./compile-arm
3.8 配置成功
3.9Make
3.9.1可能会报错
执行:cp ../../mysql-5.7.27-pc/BUILD/extra/comp_err ./extra/
touch ./extra/comp_err
3.9.2 继续make
执行:cp ../../mysql-5.7.27-pc/BUILD/libmysql/libmysql_api_test ./libmysql
touch ./libmysql/libmysql_api_test (其实touch的作用就是修改一下时间,vi打开保存其实也可以的)
3.9.3继续make
执行:这个问题比较复杂
3.9.3.1:vi ../storage/innobase/include/os0thread.ic
将IB_STRONG_MEMORY_MODEL改为HAVE_ATOMIC_BUILTINS
vi ../storage/innobase/include/os0atomic.h
1.将HAVE_IB_ATOMIC_PTHREAD_T_GCC改为HAVE_ATOMIC_BUILTINS
2.将HAVE_GCC_SYNC_BUILTINS改为HAVE_ATOMIC_BUILTINS
#define IB_STRONG_MEMORY_MODEL 后面加
#else
#define HAVE_ATOMIC_BUILTINS
3.9.4 继续make
执行:cp ../../mysql-5.7.27-pc/BUILD/sql/gen_lex_hash ./sql/
touch ./sql/gen_lex_hash
3.9.5 继续make
执行:cp ../../mysql-5.7.27-pc/BUILD/scripts/comp_sql ./scripts/
touch scripts/comp_sql
3.9.6 继续make
执行:cp ../../mysql-5.7.27-pc/BUILD/sql/gen_lex_token ./sql/
touch sql/gen_lex_token
3.9.7 继续make
执行:
cp ../../mysql-5.7.27-pc/BUILD/extra/protobuf/protoc ./extra/protobuf/
touch extra/protobuf/protoc
3.9.8 继续make
编译完成,大功告捷!!!
3.9.9 install安装
执行:DESTDIR=/opt/mysql_arm_install/ make install
可以看到编译成功后的文件:64-bit ARM aarch64 交叉编译成功
4.0 将编译完成的文件打包拷贝到ARM平台即可
拷贝的文件包括/bin /include/ lib等
4.0.1:tftp -gr libmysqlclietn.tar.gz 192.168.101.198
4.0.2:tar -xf libmysqlclietn.tar.gz
4.0.3:mkdir /usr/local/lib
4.0.4:cp libmysqlclient.so* /usr/local/lib/
4.0.5:ln -s libmysqlclient.so.20 /usr/local/lib/libmysqlclient.so.20 软连接
5.0 ubuntu中交叉编译指令:
aarch64-himix200-linux-g++ *.cpp -lpthread -I /usr/local/mysql_arm/usr/local/mysql/include -L/usr/local/mysql_arm/usr/local/mysql/lib -lmysqlclient -lpthread -lm -lrt -latomic -ldl -o b.out
番外解释:
可以看到编译完成后的文件大小占了6.8个G。加上pc端编译至少要预留15G内存