交叉编译MySQL的【C API (libmysqlclient)】

交叉编译MySQL的【C API (libmysqlclient)】

本文主要进行的对mysql的"C API (libmysqlclient)"进行arm的交叉编译。请注意不是对mysql-server的交叉编译。
本文的前提是你已经下载了对应的交叉编译工具链(cross compile toolchain)。
我使用的是aarch64的交叉编译工具链。主机是Ubuntu16.04+64bit的。目标机是arm平台的,64位。
这个跟我的不一样没关系,文章主要是讲解过程,只要对应的工具链对就行。

下载源码,已下载请跳过

首先下载mysql的"C API (libmysqlclient)“的源码,官方有提供,在MySQL Community Downloads页面中,提供了很多mysql相关的文件下载,有server的还有各种客户端的。大家有其他需要的可以在这里下载。
我们这次需要点击"C API (libmysqlclient)”,进去之后官方是推荐直接下载8.0的server,因为8.0的client是包含在server里的,且向下兼容。
需要8.0的就直接点击1处的连接。
在这里插入图片描述
但是一般5.7以下的使用之前版本的客户端就行,这时候需要点击2处的连接。进去之后版本根据需要选择,我用的最新的。然后选择Source Code,等待列表更新之后,根据自己系统选择不同的压缩包,我用的是Ubuntu,选的是"Generic Linux (Architecture Independent), Compressed TAR Archive"。
在这里插入图片描述

编译准备,环境配置

libmysqlclient 的交叉编译根据网上查找不是很友好,稍微繁琐,要编译两遍:
第一遍,编译主机平台的libmysqlclient,即普通编译。
第二版,编译目标平台的libmysqlclient,即交叉编译。

因为执行交叉编译的时候需要主机平台编译出来的一些工具,所以需要先编译主机平台的libmysqlclient。

编译主机平台libmysqlclient

首先将下载的tar包解压,然后进入对应目录中,创建build文件夹,然后执行cmake生成Makefile,接着执行make编译主机平台的libmysqlclient,指令如下:

tar -zxf mysql-connector-c-6.1.11-src.tar.gz
mv mysql-connector-c-6.1.11-src mysql-connector-c-6.1.11-src-x86
cd mysql-connector-c-6.1.11-src-x86
mkdir build && cd build
cmake ..
make

到这里主机平台的mysql客户端就编译好了。一般不会出错。出错请留言或者自行查找。一般是需要有boost环境,就是主机上有编译好的boost库。不过一般用交叉编译的,应该都是开发者了。
这个主机平台的先不要动,保存好,一会交叉编译会用到。

交叉编译目标平台libmysqlclient

我是为了更清晰和独立,这里重新解压刚才下载的源码包。其实也可以直接在原来解压的源码文件夹里新建一个buildArm的文件夹。

tar -zxf mysql-connector-c-6.1.11-src.tar.gz
mv mysql-connector-c-6.1.11-src mysql-connector-c-6.1.11-src-arm
cd mysql-connector-c-6.1.11-src-arm
mkdir build

修改文件夹下的CMakeLists.txt文件,在文件开头处添加交叉编译相关说明:

#####################################################
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSROOT /path/to/your/crosscompile/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc)
# specify the cross compiler
set(tools /path/to/your/crosscompile/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu)
set(CMAKE_C_COMPILER ${tools}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-linux-gnu-g++)

# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

SET(STACK_DIRECTION 1)
SET(HAVE_LLVM_LIBCPP OFF)
SET(HAVE_C_FLOATING_POINT_OPTIMIZATION_PROBLEMS OFF)
SET(HAVE_CXX_FLOATING_POINT_OPTIMIZATION_PROBLEMS OFF)
#####################################################

注意事项:

  1. 注意修改上面的【/path/to/your/crosscompile/toolchain】的相关部分,但是CMAKE_SYSROOT最后一定是指定到libc下。
  2. 其中最后四个set语句涉及到两类错误,具体如下:

2.1 错误1

CMake Error at configure.cmake:632 (MESSAGE):
  STACK_DIRECTION is not defined.  Please specify -DSTACK_DIRECTION=1 or
  -DSTACK_DIRECTION=-1 when calling cmake.
Call Stack (most recent call first):
  CMakeLists.txt:472 (INCLUDE)

解决办法就是【SET(STACK_DIRECTION 1)】

2.2 错误2

-- Performing Test HAVE_C_FLOATING_POINT_OPTIMIZATION_PROBLEMS
CMake Error: TRY_RUN() invoked in cross-compiling mode, please set the following cache variables appropriately:
   HAVE_C_FLOATING_POINT_OPTIMIZATION_PROBLEMS_EXITCODE (advanced)
For details see /home/lc/aworkspace/chainsqlCx/armv8lib/mysql-connector-c-6.1.11-src-arm/build/TryRunResults.cmake
-- Performing Test HAVE_C_FLOATING_POINT_OPTIMIZATION_PROBLEMS - Failed
-- Performing Test HAVE_CXX_FLOATING_POINT_OPTIMIZATION_PROBLEMS
CMake Error: TRY_RUN() invoked in cross-compiling mode, please set the following cache variables appropriately:
   HAVE_CXX_FLOATING_POINT_OPTIMIZATION_PROBLEMS_EXITCODE (advanced)
For details see /home/lc/aworkspace/chainsqlCx/armv8lib/mysql-connector-c-6.1.11-src-arm/build/TryRunResults.cmake
-- Performing Test HAVE_CXX_FLOATING_POINT_OPTIMIZATION_PROBLEMS - Failed
-- LibMySQL 6.1.11
-- Built from MySQL 5.7.16 sources
-- Packaging as: mysql-connector-c-6.1.11-Linux-
-- Installing to: /home/lc/aworkspace/chainsqlCx/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr
-- Performing Test HAVE_LLVM_LIBCPP
CMake Error: TRY_RUN() invoked in cross-compiling mode, please set the following cache variables appropriately:
   HAVE_LLVM_LIBCPP_EXITCODE (advanced)
For details see /home/lc/aworkspace/chainsqlCx/armv8lib/mysql-connector-c-6.1.11-src-arm/build/TryRunResults.cmake
-- Performing Test HAVE_LLVM_LIBCPP - Failed

2.2解决办法一
这个错误出现之后,再次执行【cmake …】,就可以生成Makefile文件了,只不过上述三个错误检测只是显示失败:

-- Running cmake version 3.5.1
-- SIZEOF_VOIDP 8
-- Performing Test HAVE_C_FLOATING_POINT_OPTIMIZATION_PROBLEMS
-- Performing Test HAVE_C_FLOATING_POINT_OPTIMIZATION_PROBLEMS - Failed
-- Performing Test HAVE_CXX_FLOATING_POINT_OPTIMIZATION_PROBLEMS
-- Performing Test HAVE_CXX_FLOATING_POINT_OPTIMIZATION_PROBLEMS - Failed
-- LibMySQL 6.1.11
-- Built from MySQL 5.7.16 sources
-- Packaging as: mysql-connector-c-6.1.11-Linux-
-- Installing to: /home/lc/aworkspace/chainsqlCx/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr
-- Performing Test HAVE_LLVM_LIBCPP
-- Performing Test HAVE_LLVM_LIBCPP - Failed
-- Library mysqlclient depends on OSLIBS -lpthread;m;rt;atomic;dl
-- CMAKE_BUILD_TYPE: RelWithDebInfo
-- COMPILE_DEFINITIONS: _GNU_SOURCE;_FILE_OFFSET_BITS=64;HAVE_CONFIG_H
-- CMAKE_C_FLAGS:  -Wall -Wextra -Wformat-security -Wvla -Wwrite-strings -Wdeclaration-after-statement -Wno-unused-parameter
-- CMAKE_CXX_FLAGS:  -Wall -Wextra -Wformat-security -Wvla -Woverloaded-virtual -Wno-unused-parameter
-- CMAKE_C_FLAGS_RELWITHDEBINFO: -O3 -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing -fno-expensive-optimizations -DDBUG_OFF
-- CMAKE_CXX_FLAGS_RELWITHDEBINFO: -O3 -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing -std=gnu++03 -fno-expensive-optimizations -DDBUG_OFF
-- Configuring done
-- Generating done
-- Build files have been written to: /home/lc/aworkspace/chainsqlCx/armv8lib/mysql-connector-c-6.1.11-src-arm/build

2.2解决办法二
对于错误2还有一种方法,就是在CMakeLists.txt中禁止检测:
SET(HAVE_LLVM_LIBCPP OFF)
SET(HAVE_C_FLOATING_POINT_OPTIMIZATION_PROBLEMS OFF)
SET(HAVE_CXX_FLOATING_POINT_OPTIMIZATION_PROBLEMS OFF)

目前这两类错误的解决方法没有发现有什么影响,可以正常使用。

修改好CMakeLists.txt文件后,进入build目录,执行以下命令:

cmake ..

然后接下来如果直接开始make编译会报错:

Generating ../include/mysqld_error.h, ../sql/share/english/errmsg.sys
/bin/sh: 1: comp_err: not found

这里的comp_err就是需要刚才主机平台编好的。所以我们需要把刚才主机平台的【build/extra】目录下的所有可执行文件都拷贝到目标平台的【build/extra】文件夹下,一般有【comp_err,my_print_defaults,perror,resolveip】。拷贝过来之后需要把目标平台的【build/extra】加到环境变量,需要在build目录下执行,然后直接执行make指令:

export PATH=$PATH:`pwd`/extra
make

成功编译。在【build/libmysql】下有编译好的静态和动态库。

libmysqlclient.a
libmysqlclient.so -> libmysqlclient.so.18*
libmysqlclient.so.18 -> libmysqlclient.so.18.4.*
libmysqlclient.so.18.4.*

安装,make install

需要执行安装的话,可以在执行cmake的时候就指定【–prefix】安装路径,也可以执行以下命令:

make install DESTDIR=/path/to/install/

会在这个路径下生成一个【/path/to/install/usr/local/mysql】这样的一个层级文件夹,然后lib和include都在mysql文件夹中。
写这个文章是因为在做交叉编译的时候,网上找了半天都比较零散,而且时间都过去好久。不过还是参考了很多。所以我整理了下我的过程,把踩过的坑也都写进来,方便大家借鉴。

文中有错误可以评论区指出。
文章有用,记得点赞啊!

参考文章:
http://dp.nonoo.hu/cross-compiling-mysql/
https://bugs.mysql.com/bug.php?id=61340
https://blog.csdn.net/jhting/article/details/79715458
https://blog.csdn.net/catemo/article/details/53136343

发布了22 篇原创文章 · 获赞 36 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/lc315yuhuofei/article/details/103711181
今日推荐