mysql5.7.22移植arm遇到的問題,尚未解決
開發環境:Ubuntu18.04LTS虛擬機
交叉編譯工具:使用apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
第一步,前往https://downloads.mysql.com/archives/>mysql官網下載源碼,本人下載的5.7.21不帶boost的版本。
參考https://blog.csdn.net/jianhuifu/article/details/58049909>移植MySQL - CSDN博客這篇博客,先編譯x86版本。
$ tar zxf mysql-5.5.54.tar.gz
$ mv mysql-5.5.54 mysql-5.5.54-x86
$ cd mysql-5.5.54-x86
$ cmake . # 不需要指定特殊的編譯選項
$ make
在cmake的過程中提示下載boost_1_59_0.tar.gz,https://download.csdn.net/download/oscer2016/9854622我是在這下載的,官網貌似也有但是速度慢。
隨後cmake成功,然後等了一個多小時編譯成功。
第二步,配置arm交叉編譯環境,參照那篇配置mips的配置,新建arm.cmake。
SET(CMAKE_SYSTEM_NAME Linux)
# $ENV{OCTEON_ROOT}表示引用環境變量OCTEON_ROOT
SET(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
SET(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabihf/)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# 下面兩個變量是mysql特有的變量,定義的值需要進行測試確認。
# 測試方法可以在CMakeList.txt中找到
SET(STACK_DIRECTION -1)
SET(CMAKE_BUILD_TYPE RelWithDebInfo)
然後運行cmake,
$ tar zxf mysql-5.5.54.tar.gz
$ cd mysql-5.5.54
$ cmake \
-DCMAKE_TOOLCHAIN_FILE=arm.cmake \ # 指定使用arm交叉工具鏈交叉編譯
-DCMAKE_INSTALL_PREFIX=/usr \ # mysql在目標文件系統中的安裝路徑
-DMYSQL_DATADIR=/data \
-DSYSCONFDIR=/etc \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
.
然後運行出錯,提示找不到boost_1_59_0,然而我明明已經下載好了放到了相應的位置,推測是需要我交叉編譯boost,於是百度搜索boost交叉編譯。
第三步、移植boost。
參考了這篇博客https://www.cnblogs.com/landy-weiai/p/3660224.html>移植boost_1_55_0至arm的方法小結 - landy_weiai - 博客園。先運行
./bootstrap.sh
然後修改生成的project-config.jam文件
修改五處:
using gcc : arm : arm-none-linux-gnueabi-gcc ;
option.set prefix :(交叉編譯器所在位置);
option.set exec-prefix :(交叉編譯器所在位置)/bin ;
option.set libdir :(交叉編譯器所在位置)/lib ;
option.set includedir :(交叉編譯器所在位置)/include ;
然後
./b2
./b2 install
成功安裝後,回到正題,這時要將安裝的位置加到arm.cmake文件中
SET(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabihf/ <thePathToBoost>)
刪除CMakeCache.txt,重新運行cmake,這一次提示不存在ncurses,同樣的,交叉編譯ncurses,
第三步、移植ncurses
清華鏡像開源網站https://mirrors.tuna.tsinghua.edu.cn/gnu/ncurses/下載最新的ncurses-6.1.tar.gz。
./configure --host=arm-linux --prefix=/opt/ncurses CC=arm-linux-gnueabihf-gcc
然後make 以及make install
在make install時出現了一個小問題,
strip: Unable to recognise the format of the input file `/opt/ncurses/bin/tic …….
經百度,原因是make install時 根據PATH設置的路徑的先後順序,選擇了x86版的strip,而在這裏,需要使用的是arm版的,於是調整順序。
export PATH=/usr/arm-linux-gnueabihf/bin/:$PATH
然後將位置加到arm.cmake中。
重新運行cmake,
然而不遂人意。
還是報錯了
-- INSTALL mysqlclient.pc lib/pkgconfig
-- CMAKE_BUILD_TYPE: RelWithDebInfo
-- COMPILE_DEFINITIONS: _GNU_SOURCE;_FILE_OFFSET_BITS=64;BOOST_GEOMETRY_SQRT_CHECK_FINITENESS;HAVE_CONFIG_H;HAVE_LIBEVENT1
-- CMAKE_C_FLAGS: -lpthread -lm -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mthumb -Wall -Wextra -Wformat-security -Wvla -Wimplicit-fallthrough=2 -Wwrite-strings -Wdeclaration-after-statement
-- CMAKE_CXX_FLAGS: -Wall -Wextra -Wformat-security -Wvla -Wimplicit-fallthrough=2 -Woverloaded-virtual -Wno-unused-parameter
-- CMAKE_C_LINK_FLAGS:
-- CMAKE_CXX_LINK_FLAGS:
-- CMAKE_C_FLAGS_RELWITHDEBINFO: -O3 -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing -ffp-contract=off -fno-expensive-optimizations -DDBUG_OFF
-- CMAKE_CXX_FLAGS_RELWITHDEBINFO: -O3 -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing -std=gnu++03 -ffp-contract=off -fno-expensive-optimizations -DDBUG_OFF
-- Configuring incomplete, errors occurred!
See also "/home/bwang/qteverywhere/mysql-5.7/CMakeFiles/CMakeOutput.log".
See also "/home/bwang/qteverywhere/mysql-5.7/CMakeFiles/CMakeError.log".
進入CMakeError.log中,定位到最早的error中
184 Linking C executable cmTC_15480
185 /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_15480.dir/link.txt --v erbose=1
186 /usr/bin/arm-linux-gnueabihf-gcc -rdynamic CMakeFiles/cmTC_15480.dir/ CheckSymbolExists.c.o -o cmTC_15480
187 CMakeFiles/cmTC_15480.dir/CheckSymbolExists.c.o: In function `main':
188 CheckSymbolExists.c:(.text+0x2c): undefined reference to `pthread_create'
189 collect2: error: ld returned 1 exit status
190 CMakeFiles/cmTC_15480.dir/build.make:97: recipe for target 'cmTC_15480' fa iled
191 make[1]: *** [cmTC_15480] Error 1
192 make[1]: Leaving directory '/home/bwang/qteverywhere/mysql-5.7/CMakeFiles/ CMakeTmp'
193 Makefile:126: recipe for target 'cmTC_15480/fast' failed
194 make: *** [cmTC_15480/fast] Error 2
以爲是沒加-lpthread的原因,
#!/bin/sh
rm CMakeCache.txt
cmake \
-G "Unix Makefiles" \
-DCMAKE_INSTALL_PREFIX=/opt/mysql-5.7 \
-DCMAKE_TOOLCHAIN_FILE=arm.cmake \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DCMAKE_C_FLAGS="${CMAKE_C_FLAGS} -lpthread -lm -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mthumb"
添加了最下面一行,還是沒法解決。於是又去下載了5.6版本也是不行。
最後只能先暫時放棄,還是選擇移植5.1版本的mysql,這個的教程也有很多,關鍵是能夠成功移植。
途中還參考了以下博客:
1、https://blog.csdn.net/catemo/article/details/53136343>ubuntu 16.04 交叉編譯 mysql 5.7.16 到 arm平臺 - CSDN博客
2、http://dp.nonoo.hu/cross-compiling-mysql/> Cross-compiling MySQL at dreamport | nonoo.hu