交叉編譯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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章