1.编译交叉编译工具
下载源码并编译安装,地址:http://crosstool-ng.org/download/crosstool-ng/
tar xvf crosstool-ng-1.24.0.tar.xz
安装依赖的包
yum install gcc-c++
yum install gperf
yum install bison
yum install flex
yum install texinfo
yum install help2man
yum install patch
yum install ncurses-devel
./configure --prefix=/usr/local/crosstool-1.24.0
然后make && make install
设置PATH
export PATH=/usr/local/crosstool-1.24.0/bin:$PATH
这样交叉编译工具ct-ng就编译好了
2.搭建交叉编译工具
创建用户niuhe,因为ct-ng工具不能用root用户去使用
创建存放制作交叉编译环境的目录
mkdir -p /home/niuhe/crosstool-23/build src x-tools
src存放下载下来的源码
x-tools存放编译好的交叉编译环境
build为编译的目录
接下来就可以开始制作arm64交叉编译工具链
首先,我们可以查看当前版本的有哪些模板样例,执行如下命令:
ct-ng list-samples
输出:
Status Sample name
[G...] aarch64-rpi3-linux-gnu
[G..X] aarch64-unknown-linux-android
[G...] aarch64-unknown-linux-gnu
[G...] aarch64-unknown-linux-uclibc
[G...] alphaev56-unknown-linux-gnu
[G...] alphaev67-unknown-linux-gnu
[G...] arc-arc700-linux-uclibc
[G...] arc-multilib-elf32
[G...] arc-multilib-linux-uclibc
[G...] arm-bare_newlib_cortex_m3_nommu-eabi
[G...] arm-cortex_a15-linux-gnueabihf
[G..X] arm-cortexa5-linux-uclibcgnueabihf
[G...] arm-cortex_a8-linux-gnueabi
[G..X] arm-cortexa9_neon-linux-gnueabihf
......
进入build目录
执行ct-ng aarch64-unknown-linux-gnu
执行ct-ng menuconfig,进入界面配置指定源码路径及交叉编译安装路径及各种源码及版本
会在build目录下生成.config配置文件
主界面:
Paths and misc options选项指定
源码路径:/home/niuhe/crosstool-24/src
build目录:/home/niuhe/crosstool-24/build
安装目录:/home/niuhe/crosstool-24/x-tools
Number of parallel jobs选项设置,编译线程数:8
C-library选项指定
glibc版本:2.17
这里默认指定2.28,编译glibc时报:
意思make版本过旧,后来设置glibc的版本2.17,编译通过。
报错实际上是glibc源码的configure文件的5301 5302行:
5301 *** These critical programs are missing or too old:$critic_missing
5302 *** Check the INSTALL file for required versions." "$LINENO" 5
C compiler选项指定
编译器选项指定gcc版本7.4
Debug facilitier选项指定
这里指定了gdb(去掉了Enable python scripting选项,否则报找不到/usr/bin/python27,但实际上有安装python2.7),和strace;这两个指不指定其实没所谓
Companion tools选项指定
指定autoconf2.69和libtool2.4.6
其他,都用aarch64-unknown-linux-gnu模板的默认选项
然后ct-ng build编译,因为没有联网,会报下载各个源码失败的错误。
依次下载对应的源码:
-rw-rw-r--. 1 niuhe niuhe 1977576 Feb 26 14:13 make-4.2.1.tar.gz -rw-rw-r--. 1 niuhe niuhe 2006643 Feb 26 14:23 m4-1.4.18.tar.gz -rw-rw-r--. 1 niuhe niuhe 2300906 Feb 26 14:25 automake-1.16.1.tar.gz -rw-rw-r--. 1 niuhe niuhe 161197451 Feb 26 14:39 linux-4.20.8.tar.gz -rw-rw-r--. 1 niuhe niuhe 607698 Feb 26 14:45 zlib-1.2.11.tar.gz -rw-rw-r--. 1 niuhe niuhe 2386766 Feb 26 15:22 gmp-6.1.2.tar.bz2 -rw-rw-r--. 1 niuhe niuhe 2211910 Feb 26 15:26 mpfr-4.0.2.tar.gz -rw-rw-r--. 1 niuhe niuhe 2036201 Feb 26 15:38 isl-0.20.tar.gz -rw-rw-r--. 1 niuhe niuhe 701263 Feb 26 15:40 mpc-1.1.0.tar.gz -rw-rw-r--. 1 niuhe niuhe 513322 Feb 26 15:49 expat-2.2.6.tar.bz2 -rw-rw-r--. 1 niuhe niuhe 3365395 Feb 26 16:22 ncurses-6.1.tar.gz -rw-rw-r--. 1 niuhe niuhe 5264188 Feb 26 16:30 libiconv-1.15.tar.gz -rw-rw-r--. 1 niuhe niuhe 19704011 Feb 26 16:43 gettext-0.19.8.1.tar.gz -rw-rw-r--. 1 niuhe niuhe 112420370 Feb 26 16:56 gcc-7.4.0.tar.gz -rw-rw-r--. 1 niuhe niuhe 1444216 Mar 1 16:12 strace-4.26.tar.xz -rw-rw-r--. 1 niuhe niuhe 1214744 Mar 1 16:17 autoconf-2.69.tar.xz -rw-rw-r--. 1 niuhe niuhe 973080 Mar 1 16:19 libtool-2.4.6.tar.xz -rw-rw-r--. 1 niuhe niuhe 20170388 Mar 1 16:25 gdb-8.2.1.tar.xz -rw-rw-r--. 1 niuhe niuhe 19886772 Mar 1 17:17 binutils-2.29.1.tar.xz -rw-rw-r--. 1 niuhe niuhe 10981956 Mar 1 17:20 glibc-2.17.tar.xz
然后,编译完成,aarch64架构的编译环境包括gcc include头文件 库文件等就会生成到x-tools目录下
将/home/niuhe/crosstool-24/x-tools/bin加到PATH环境变量
3验证
查看gcc版本:
编译helloword,并查看依赖,及readelf
运行时在x86_64环境运行不了
aarch64-unknown-linux-gnu-g++ helloword_arm.cc -o helloword_arm
aarch64-unknown-linux-gnu-ldd --root /home/niuhe/crosstool-24/x-tools/aarch64-unknown-linux-gnu/sysroot/lib helloword_arm
readelf -h helloword_arm
在arm64架构下运行:
编译gcc4.8.5
gcc4.8.5依赖isl版本低于0.15,否则编译报错:
gcc7.3.0依赖isl0.15版本
gcc4.8.5新增依赖cloog,变更linux内核3.10.108
[niuhe@GFS-CentOS76 src]$ ls -lrt total 525904 -rw-rw-r--. 1 niuhe niuhe 1977576 Feb 26 14:13 make-4.2.1.tar.gz -rw-rw-r--. 1 niuhe niuhe 2006643 Feb 26 14:23 m4-1.4.18.tar.gz -rw-rw-r--. 1 niuhe niuhe 2300906 Feb 26 14:25 automake-1.16.1.tar.gz -rw-rw-r--. 1 niuhe niuhe 161197451 Feb 26 14:39 linux-4.20.8.tar.gz -rw-rw-r--. 1 niuhe niuhe 607698 Feb 26 14:45 zlib-1.2.11.tar.gz -rw-rw-r--. 1 niuhe niuhe 2386766 Feb 26 15:22 gmp-6.1.2.tar.bz2 -rw-rw-r--. 1 niuhe niuhe 2211910 Feb 26 15:26 mpfr-4.0.2.tar.gz -rw-rw-r--. 1 niuhe niuhe 2036201 Feb 26 15:38 isl-0.20.tar.gz -rw-rw-r--. 1 niuhe niuhe 701263 Feb 26 15:40 mpc-1.1.0.tar.gz -rw-rw-r--. 1 niuhe niuhe 513322 Feb 26 15:49 expat-2.2.6.tar.bz2 -rw-rw-r--. 1 niuhe niuhe 3365395 Feb 26 16:22 ncurses-6.1.tar.gz -rw-rw-r--. 1 niuhe niuhe 5264188 Feb 26 16:30 libiconv-1.15.tar.gz -rw-rw-r--. 1 niuhe niuhe 19704011 Feb 26 16:43 gettext-0.19.8.1.tar.gz -rw-rw-r--. 1 niuhe niuhe 112420370 Feb 26 16:56 gcc-7.4.0.tar.gz -rw-rw-r--. 1 niuhe niuhe 1444216 Mar 1 16:12 strace-4.26.tar.xz -rw-rw-r--. 1 niuhe niuhe 1214744 Mar 1 16:17 autoconf-2.69.tar.xz -rw-rw-r--. 1 niuhe niuhe 973080 Mar 1 16:19 libtool-2.4.6.tar.xz -rw-rw-r--. 1 niuhe niuhe 20170388 Mar 1 16:25 gdb-8.2.1.tar.xz -rw-rw-r--. 1 niuhe niuhe 19886772 Mar 1 17:17 binutils-2.29.1.tar.xz -rw-rw-r--. 1 niuhe niuhe 10981956 Mar 1 17:20 glibc-2.17.tar.xz -rw-rw-r--. 1 niuhe niuhe 73489452 Mar 4 10:38 linux-3.10.108.tar.xz -rw-rw-r--. 1 niuhe niuhe 1406988 Mar 4 10:41 isl-0.15.tar.xz -rw-rw-r--. 1 niuhe niuhe 4796456 Mar 4 10:46 cloog-0.18.4.tar.gz -rw-rw-r--. 1 niuhe niuhe 86165587 Mar 4 10:48 gcc-4.8.5.tar.bz2 -rw-rw-r--. 1 niuhe niuhe 1247052 Mar 4 11:30 isl-0.14.tar.xz
去掉strace,4.26版本,编译报错:
4.5.18版本,也编译不过,没有啥影响就不找了。
将编译后的安装目录变更为:/home/niuhe/crosstool-24/gcc4.8.5
与原.config比对大致差异:
编译arm64架构libevent库
下载源码并解压
tar zxvf libevent-2.1.12-stable.tar.gz
然后configure, 指定交叉编译工具链的前缀(前提要将/home/niuhe/crosstool-24/x-tools/bin加到环境变量里),指定安装位置,因为没有编译openssl禁掉openssl
./configure --host=aarch64-unknown-linux-gnu --disable-openssl --prefix=/root/niuhe/libevent/libevent
然后make && make install
编译arm64架构Wind.Cosmos.Base
1.6版本只依赖libevent库,所以拿1.6版本编译尝试
编译x86_64版本
linux x64环境编译报错,查看代码发现有两个宏定义有问题,改为
#define PRId32 "%d"
#define PRId64 "%d"
需要宏定义 -D__STDC_FORMAT_MACROS (libc2.17需要宏定义,libc2.28则在inttypes.h头文件中取消了这个宏定义的条件)
编译通过
编译arm64版本
CMakeList.txt中指定编译器
SET(CMAKE_CXX_COMPILER /home/niuhe/crosstool-24/x-tools/bin/aarch64-unknown-linux-gnu-g++)
依赖库libevent替换为mips版本
编译通过
遇到问题解决:
将arm64平台的so库,及头文件放到交叉编译工具链的对应目录
/home/niuhe/crosstool-24/gcc7.3/aarch64-unknown-linux-gnu/sysroot/lib
/home/niuhe/crosstool-24/gcc7.3/aarch64-unknown-linux-gnu/include
另外,将arm64平台的几个.a库别名
libc.a.bak
libdl.a.bak
libm.a.bak
libpthread.a.bak
编译juce库时,CMakeLists.txt中有find_package, 和pkg_check_modules
原cmake 3.16.0有问题,提示FindPkgConfig.make 找不到,pkg_check_modules提示Unknown CMake command "pkg_check_modules"
重新编译cmake3.16.2源码:
进入源码目录
./bootstrap --prefix=/usr/local/bin
make && make install
然后重新ln到/usr/bin/cmake
另外,juce库依赖很多安装库,将arm64环境的安装库pkgconfig目录拷贝到/home/niuhe/crosstool-24/gcc7.3/aarch64-unknown-linux-gnu/sysroot/lib
然后export PKG_CONFIG_PATH=/home/niuhe/crosstool-24/gcc7.3/aarch64-unknown-linux-gnu/sysroot/lib/pkgconfig/
但是,有一个问题,如果CMakeLists.txt中set了 ENV{PKG_CONFIG_PATH};那么,设置的PKG_CONFIG_PATH环境变量就被替换了,那么可能就找不到环境变量中设置的PKG_CONFIG_PATH指定的目录下的*.pc文件了,那么就找不到对应库的路径了。
那么,我们看pkg-config的信息从哪里来?
很简单,有2种路径:
第一种:取系统的/usr/lib/pkgconfig下的所有*.pc文件。x86_64架构在/usr/lib64/pkgconfig目录下
第二种:PKG_CONFIG_PATH环境变量所指向的路径下的所有*.pc文件。
那么,arm64环境移植过来的安装库pkgconfig目录,可以不通过PKG_CONFIG_PATH配置,通过:
mv /usr/lib64/pkgconfig /usr/lib64/pkgconfig.bak
ln -sf /home/niuhe/crosstool-24/gcc7.3/aarch64-unknown-linux-gnu/sysroot/lib/pkgconfig /usr/lib64/pkgconfig
这样,pkg_check_modules时,就可以找到对应库的路径了。
只是,通过交叉编译工具链编译arm64,可以通过pkg-config找对应的库路径,x86_64编译,就不能用pkg-config找对应的库路径了。
并且通过脚本修改pkgconfig目录下*.pc文件的includedir和libdir
#! /bin/sh prefix="\/home\/niuhe\/crosstool-24\/gcc7.3\/aarch64-unknown-linux-gnu" files=`ls *pc` for f in $files do find . -name "$f" |xargs sed -i "s/^prefix=\/usr/prefix=$prefix/; s/libdir=\${prefix}\/lib\/aarch64-linux-gnu/libdir=\${prefix}\/sysroot\/lib/" echo $f done
最后,cmake .
make
编译通过
cmake教程(三)find_package和pkg_check_modules
cmake:pkg_check_modules
Makefile 使用总结
cmake
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "\${ORIGIN}")
Linux C编程(8) 使用相对路径加载动态库-rpath和$ORIGIN
 
centos7.6通过crosstool-ng编译搭建arm64交叉编译环境:等您坐沙发呢!