手把手交叉编译mysql
创始人
2024-05-30 03:10:11
0

1.下载mysql(注意下载boost版本,这样会少一步编译)

下载mysql的时候一定要看好交叉编译工具链的版本。因为mysql 8.0需要的工具链版本较高,所以有可能不支持

 

 

查看链接如下:

MySQL :: MySQL 8.0 Reference Manual :: 2.8.2 Source Installation Prerequisites

下载链接如下:

MySQL :: Download MySQL Community Server (Archived Versions)

此处我选择5.7.40

 

2.下载 ncurses 和 openssl。

openssl有版本要求,不要乱下。openssl版本要求查看地址如下

https://dev.mysql.com/doc/refman/8.0/en/source-ssl-library-configuration.html

 

通过右上角版本切换查看需要的openssl版本。

ncurses没有版本要求,但是对自己的PC机可能会有影响。当交叉编译不过且百度又不好解决的时候,换一个版本未尝不是一个办法。最开始我使用的是ncurses 6.4,不通过换成了 6.2,后来又换成5.9才编译通过

我的编译流程是参考这位大师的,所以大家也可以看看他的原博客。我遇到的错误他基本都给出了答案

mysql交叉编译方式_交叉编译mysql_Lanceli_van的博客-CSDN博客

3.编译mysql(注意不是交叉编译,是正常编译)

cmake . -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/home/zx/mysql-5.7.40-pc/boost -DCMAKE_INSTALL_PREFIX=/home/zx/mysql-5.7.40-pc/output
make 

make install

这一步基本没啥问题

如果报openssl库的错误,直接安装即可

apt-get install openssl
apt-get install libssl-dev
 

4.交叉编译  ncurse 和 openssl

如果ncurse编译错误,且百度不好解决,那就换个版本在交叉编译(我换了仨版本,o(╥﹏╥)o)

交叉编译openssl

./config --prefix=/home/mysqlCompile/openssl-OpenSSL_1_1_1g/__install --cross-compile-prefix=aarch64-none-linux-gnu- no-asm shared

打开Makefile,删除Makefile里面的 -m64


make
make install
 

5.修改mysql的CMakeList,找到  PROJECT(${MYSQL_PROJECT_NAME})  添加如下内容。(注意修改交叉编译工具和路径)(注意格式,一定要注意对齐,否则会出现-Wmisleading-indentation错误。如果不知道前面用tab还是空格,那就直接复制下面的格式来对齐)

#----------------------------------------------------------------
IF(1)
    
set(CMAKE_FIND_ROOT_PATH "/home/zx/arm-linux/bin")
set(CMAKE_CROSSCOMPILING TRUE)
SET(CMAKE_SYSTEM_NAME Linux)

# 设置交叉编译器
SET(CMAKE_C_COMPILER_WORKS 1)
SET(CMAKE_CXX_COMPILER_WORKS 1)
SET(CMAKE_C_COMPILER   "arm-linux-gnueabihf-gcc")
SET(CMAKE_CXX_COMPILER "arm-linux-gnueabihf-g++")

# 交叉编译时的编译选项,cpu 需要该选项的时候添加,没有可以不加  
#SET(ARM_CFLAG "-march=armv7-a -Og -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 -pipe -feliminate-unused-debug-types")
#SET(CMAKE_EXE_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed")

# 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(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

SET(STACK_DIRECTION 1)
SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_CROSSCOMPILING 1)
set(BOOST_INCLUDE_DIR /home/zx/mysql-5.7.40/boost/boost_1_59_0)
set(LOCAL_BOOST_DIR /home/zx/mysql-5.7.40/boost/boost_1_59_0)
    
# openssl configuration
SET(OPENSSL_INCLUDE_DIR /home/zx/openssl-1.1.1g/output/include)
SET(OPENSSL_LIBRARY /home/zx/openssl-1.1.1g/output/lib/libssl.so.1.1)
SET(CRYPTO_LIBRARY /home/zx/openssl-1.1.1g/output/lib/libcrypto.so.1.1)

SET(CMAKE_CXX_LINK_FLAGS "-L/home/zx/openssl-1.1.1g/output/lib -lssl -lcrypto")
ENDIF()
#----------------------------------------------------------------

PROJECT(${MYSQL_PROJECT_NAME})

#----------------------------------------------------------------
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ARM_CFLAG}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARM_CFLAG}")
#----------------------------------------------------------------
 

修改mysql的 cmake/libevent.cmake 文件,(在说一遍,注意格式对齐)

MACRO(FIND_LIBEVENT_VERSION)

  SET(LIBEVENT_VERSION "2.1.11-stable")
  SET(COMPILE_TEST_RESULT TRUE)
  SET(RUN_OUTPUT "2.1.11-stable")

  # MESSAGE(STATUS "TRY_EVENT TEST_RUN_RESULT is ${TEST_RUN_RESULT}")
  # MESSAGE(STATUS "TRY_EVENT COMPILE_TEST_RESULT is ${COMPILE_TEST_RESULT}")
  # MESSAGE(STATUS "TRY_EVENT COMPILE_OUTPUT_VARIABLE is ${OUTPUT}")
  # MESSAGE(STATUS "TRY_EVENT RUN_OUTPUT_VARIABLE is ${RUN_OUTPUT}")

  IF(COMPILE_TEST_RESULT)
    SET(LIBEVENT_VERSION_STRING "${RUN_OUTPUT}")
    STRING(REGEX REPLACE
      "([.-0-9]+).*" "\\1" LIBEVENT_VERSION "${LIBEVENT_VERSION_STRING}")
    MESSAGE(STATUS "LIBEVENT_VERSION_STRING ${LIBEVENT_VERSION_STRING}")
    MESSAGE(STATUS "LIBEVENT_VERSION (${WITH_LIBEVENT}) ${LIBEVENT_VERSION}")
  ELSE()
    MESSAGE(WARNING "Could not determine LIBEVENT_VERSION")
  ENDIF()
ENDMACRO()

6.执行cmake

cmake ../ -DCMAKE_INSTALL_PREFIX=/home/zx/mysql-5.7.40/output -DMYSQL_DATADIR=/home/zx/mysql-5.7.40/output/data -DWITH_BOOST=/home/zx/mysql-5.7.40/boost/boost_1_59_0 -DSYSCONFDIR=/etc -DEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_0900_ai_ci -DENABLED_LOCAL_INFILE=1 -DSTACK_DIRECTION=1 -DCURSES_LIBRARY=/home/zx/ncurses-5.9/output/lib/libncurses.a -DCURSES_INCLUDE_PATH=/home/zx/ncurses-5.9/output/include -DWITH_MYISAM_STORAGE_ENGINE=1

此时报了一个错

-- Performing Test X_PUTLONG_NOT_USE_CONST - Failed
-- Checking for module 'libtirpc'
--   No package 'libtirpc' found

解决办法参考此网站解决

 mysql 编译提示 undefined reference to `xdr_pointer‘_llongint的博客-CSDN博客

尝试解决1、直接安装:

yum install -y libtirpc-devel

再编译提示: 

-- Checking for module 'libtirpc'
--   Found libtirpc, version 0.2.4
CMake Warning at cmake/rpc.cmake:58 (MESSAGE):
  Ignoring libtirpc version 0.2.4, need at least 1.0
Call Stack (most recent call first):

尝试解决2:手动添加
版本太低没有捷径可走,只能手动重新编译,从这下载一个新点的版本:https://www.linuxfromscratch.org/blfs/view/svn/basicnet/libtirpc.html 

./configure --prefix=`pwd`/install
make -j`nproc` && make install


再移除系统库:

yum remove -y libtirpc-devel

再编译还是提示找不到: 

-- Performing Test X_PUTLONG_NOT_USE_CONST - Failed
-- Checking for module 'libtirpc'
--   No package 'libtirpc' found

查看库查找方式:(进入到mysql的cmake目录下) 

$ sed -n '49,53p' cmake/rpc.cmake
MACRO(MYSQL_CHECK_RPC)
  IF(LINUX AND NOT LIBTIRPC_VERSION_TOO_OLD)
    MYSQL_CHECK_PKGCONFIG()
    PKG_CHECK_MODULES(TIRPC libtirpc)
  ENDIF()

看到PKG_CHECK_MODULES 方式查找只需要再拷贝一下 .pc 文件即可

cp install/lib/pkgconfig/libtirpc.pc /usr/lib64/pkgconfig/

查找成功提示 

-- Found PkgConfig: /usr/bin/pkg-config (found version "0.27.1")
-- Checking for module 'libtirpc'
--   Found libtirpc, version 1.3.2

 后面遇到错误跟大佬基本相同,但大佬有些内容写的微微有些模糊,稍微走了下弯路,故进行一个理解更新

第一个错误

/bin/sh: 1: comp_err: not found
这个错误从字面上理解,就是这个脚本没有发现。解决办法就是把我们之前本机编译得到的 comp_err 文件移动到编译环境中的 bin 文件夹中:

cp /home/mysql-5.7.40/extra/comp_err /home/zx/arm-linux/bin/
touch /home/zx/arm-linux/bin//bin/comp_err

继续执行 make 命令进行编译,我们会遇到第二个错误。

/bin/sh: 1: ./libmysql_api_test: Exec format error
解决办法是将本机编译得到的 libmysql_api_test 文件,移动到交叉编译对应的文件夹中:

cp /home/zx/mysql-5.7.40-pc/libmysql/libmysql_api_test /home/zx/mysql-5.7.40/libmysql/
注意,是从第一步编译的路径下文件拷贝到交叉编译的mysql根目录下的libmysql

继续执行 make 命令进行编译,我们会遇到第三个错误。 

error “Unsupported platform”


In file included from /home/mysqlCompile/mysql-5.7.32/storage/innobase/include/os0atomic.h:375,
                 from /home/mysqlCompile/mysql-5.7.32/storage/innobase/include/ut0ut.h:47,
                 from /home/mysqlCompile/mysql-5.7.32/storage/innobase/include/univ.i:591,
                 from /home/mysqlCompile/mysql-5.7.32/storage/innobase/include/ha_prototypes.h:40,
                 from /home/mysqlCompile/mysql-5.7.32/storage/innobase/api/api0api.cc:35:
/home/mysqlCompile/mysql-5.7.32/storage/innobase/include/os0atomic.ic:230:2: error: #error "Unsupported platform"
  230 | #error "Unsupported platform"
 

这个问题如提示所示,是平台不支持,原因是宏定义的问题。os0atomic.ic 中有 HAVE_IB_GCC_ATOMIC_COMPARE_EXCHANGE 与 IB_STRONG_MEMORY_MODEL 这两个宏定义。

在 os0atomic.h 的 60 行附近, 从以上的内容可以看出,只有定义了

 __i386__ || __x86_64__ || _M_IX86 || _M_X64 || __WIN__ 
 

才能定义 IB_STRONG_MEMORY_MODEL,但是我们是交叉编译 mysql,平台是 arm,明显上面的内容没有定义,所以在交叉编译的时候就没有定义,导致 os0atomic.ic 中的内容没有编译。修改办法如下:

#if defined __i386__ || defined __x86_64__ || defined _M_IX86 \
    || defined _M_X64 || defined __WIN__

#define IB_STRONG_MEMORY_MODEL

#else

#define HAVE_ATOMIC_BUILTINS

#endif /* __i386__ || __x86_64__ || _M_IX86 || _M_X64 || __WIN__ */
 

HAVE_ATOMIC_BUILTINS 这个宏不是随便定义的,可在文章 MariaDB · 社区动态 · MariaDB on Power8 中了解到。

但这样并不能完全解决问题,在 os0atomic.h 文件中找到 os_compare_and_swap_thread_id() 这个函数的定义,而在这个函数的前面有编译条件如下:

# ifdef HAVE_IB_ATOMIC_PTHREAD_T_GCC
#if defined(HAVE_GCC_SYNC_BUILTINS)
#  define os_compare_and_swap_thread_id(ptr, old_val, new_val) \
    os_compare_and_swap(ptr, old_val, new_val)
#else
UNIV_INLINE
bool
os_compare_and_swap_thread_id(volatile os_thread_id_t* ptr, os_thread_id_t old_val, os_thread_id_t new_val)
{
  return __atomic_compare_exchange_n(ptr, &old_val, new_val, 0,
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
}
#endif /* HAVE_GCC_SYNC_BUILTINS */

 

但是交叉编译工具GCC中没有这两个宏,所以运行不了,解决方法是改为如下:

# ifdef HAVE_ATOMIC_BUILTINS
#if defined(HAVE_ATOMIC_BUILTINS)
#  define os_compare_and_swap_thread_id(ptr, old_val, new_val) \
    os_compare_and_swap(ptr, old_val, new_val)
#else
UNIV_INLINE
bool
os_compare_and_swap_thread_id(volatile os_thread_id_t* ptr, os_thread_id_t old_val, os_thread_id_t new_val)
{
  return __atomic_compare_exchange_n(ptr, &old_val, new_val, 0,
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
}
#endif /* HAVE_GCC_SYNC_BUILTINS */
 

在上面大佬的交叉编译中,有个错误

在原基础修改之上,还需修改storage/innobase/include/os0atomic.ic的第 198 行

#elif defined(IB_STRONG_MEMORY_MODEL)

#elif defined(IB_STRONG_MEMORY_MODEL) || defined (HAVE_ATOMIC_BUILTINS)

继续执行 make 命令进行编译,我们会遇到第四个错误。 

No rule to make target ‘scripts/comp_sql’ 


make[2]: *** No rule to make target 'scripts/comp_sql', needed by 'scripts/sql_commands_sys_schema.h'.  Stop.

解决办法如下: 

cp /home/zx/mysql-5.7.40-pc/scripts/comp_sql /home/zx/mysql-5.7.40/scripts/
touch  /home/zx/mysql-5.7.40/scripts/comp_sql

注意路径还是mysql的根目录下的scripts拷贝,非安装目录

继续执行 make 命令进行编译,我们会遇到第五个错误。

/bin/sh: 1: comp_sql: not found
解决办法如下:

cp /home/zx/mysql-5.7.40-pc/scripts/comp_sql /home/zx/arm-linux/bin/
touch /home/zx/arm-linux/bin/comp_sql

注意是拷贝第一步编译的mysql文件

 继续执行 make 命令进行编译,我们会遇到第六个错误。

/bin/sh: 1: gen_lex_hash: not found
解决办法如下:

cp /home/zx/mysql-5.7.40-pc/sql/gen_lex_hash /home/zx/arm-linux/bin/
touch /home/zx/arm-linux/bin/gen_lex_hash

注意是拷贝第一步编译的mysql文件

继续执行 make 命令进行编译,我们会遇到第七个错误。  

/bin/sh: 1: gen_lex_token: not found
解决办法如下:

cp /home/zx/mysql-5.7.40-pc/sql/gen_lex_token /home/zx/arm-linux/bin/
touch /home/zx/arm-linux/bin/gen_lex_token

注意是拷贝第一步编译的mysql文件

继续执行 make 命令进行编译,我们会遇到第八个错误。

cannot find -ltirpc
/home/lanceli/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.2.1/../../../../aarch64-none-linux-gnu/bin/ld: cannot find -ltirpc
collect2: error: ld returned 1 exit status
make[2]: *** [rapid/plugin/group_replication/CMakeFiles/group_replication.dir/build.make:1488: rapid/plugin/group_replication/group_replication.so] Error 1
make[1]: *** [CMakeFiles/Makefile2:5620: rapid/plugin/group_replication/CMakeFiles/group_replication.dir/all] Error 2
make: *** [Makefile:163: all] Error 2
 

这个问题直接修改link.txt,查找并将里面的-ltirpc删除即可。如果感兴趣,可以向后查看解决思路。

这个问题我们需要查看 rapid/plugin/group_replication/CMakeFiles/group_replication.dir/build.make 文件查找(CMAKE_COMMAND) -E cmake_link_script所在的位置: 

cd /home/mysqlCompile/mysql-5.7.32/rapid/plugin/group_replication && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/group_replication.dir/link.txt --verbose=$(VERBOSE)  

这里执行了一行命令,而命令的位置在 cmake_link_script CMakeFiles/group_replication.dir/link.txt 

这里显示找不到 -ltirpc 这一个指令,我们查看 link.txt 文件,并找出 -ltirpc 将它删除即可。

继续执行 make 命令进行编译,我们会遇到第九个错误
 

/bin/sh: 1: protoc: not found
解决办法如下:

cp /home/zx/mysql-5.7.40-pc/extra/protobuf/protoc /home/zx/arm-linux/bin/
root@DESKTOP-PGPFAI6:~# touch /home/zx/arm-linux/bin/protoc

继续执行 make 命令进行编译,我们会遇到第十个错误。 

cannot find -lboost_system -lboost_chrono
这个问题跟之前的 -ltirpc 一样,都是声明后找不到对应的库,这次我们不能将这两个删除掉,因为编译的过程需要用到这两个库。

/home/lanceli/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.2.1/../../../../aarch64-none-linux-gnu/bin/ld: cannot find -lboost_system
/home/lanceli/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.2.1/../../../../aarch64-none-linux-gnu/bin/ld: cannot find -lboost_chrono
collect2: error: ld returned 1 exit status
make[2]: *** [client/dump/CMakeFiles/mysqlpump.dir/build.make:92: client/dump/mysqlpump] Error 1
make[1]: *** [CMakeFiles/Makefile2:12520: client/dump/CMakeFiles/mysqlpump.dir/all] Error 2
make: *** [Makefile:163: all] Error 2
 

根据错误提示,我们打开 client/dump/CMakeFiles/mysqlpump.dir/build.make 文件,定位到第 92 行。 

cd /home/zx/mysql-5.7.40/client/dump && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/mysqlpump.dir/link.txt --verbose=$(VERBOSE)
 

打开相同路径下的 link.txt 文件,并将其中 -lboost_system -lboost_chrono 修改为: 

/home/zx/mysql-5.7.40/bost/boost_1_59_0/__install/lib/libboost_system.so -ldl /home/zx/mysql-5.7.40/bost/__install/lib/libboost_chrono.so -ldl

继续执行 make 命令进行编译,然后等待代码编译结束。 

输入 make install 进行安装,即可在设置的安装路径找到相应的文件。

 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...