交叉编译
1.交叉编译的必要性
我们在开发板上进行开发时,很多时候不会直接在板子上开发,而是在自己电脑上写代码、编译和运行。在自己电脑上编译成功并成功运行就行了吗?并不是,主要是底层架构的原因,我们自己使用的电脑基本都是x86架构或者是x86_64,而开发板上基本都是arm64,不同架构使用不同的指令集,因此可以在自己电脑上能成功运行不代表在开发板上也能成功运行;
其次,某些依赖库比如瑞芯微的mpp硬件编码库,他是要依赖于开发板环境的,我们在写代码的时候要用到这个编码库,如果这个库编译的架构的不对,我们的代码也无法编译通过。
为了能在x86环境下编译arm64的源代码,因此引入了交叉编译链,交叉编译链可以使我们在x86上编译arm64的源码,且编译成功可以直接拿到板子上运行(前提是板子上其他依赖库也配置好了)。
我的真实应用场景
之前某所项目的时候,我们使用某个板子中的RK3588芯片,底层架构是arm64,因此我们从git上拉取瑞芯微自己的mpp硬件编码库,按照文档在板子上编译mpp库,结果死活编译不过去,一直在一个底层数学库报错,就这个问题,我去网上搜各种方法,其中有一个方法是升级glibc库,结果升级了系统都进不去了,只能重新刷机。反正这个编译不过去的问题花了大概3-4天时间才解决,解决方案就是交叉编译。
2.交叉编译链的配置
2.1 下载交叉编译链
下载链接
链接:https://pan.baidu.com/s/1uxElxYOpLMe1A2Y_BeQOgg?pwd=9830
提取码:9830
2.2 创建文件夹并将交叉编译链放入文件夹
sudo mkdir -p /usr/local/ARM-toolchain
sudo mv gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.tar /usr/local/ARM-toolchain/
cd /usr/local/ARM-toolchain
2.3 解压交叉编译链
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.tar
2.4 配置环境变量
sudo vim ~/.bashrc
在~/.bashrc最后一行添加一行:
PATH=/usr/local/ARM-toolchain/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:"${PATH}"
激活环境变量:
source ~/.bashrc
查看是否配置好了:
aarch64-linux-gnu-gcc -v
使用内建 specs。
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/local/ARM-toolchain/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/…/libexec/gcc/aarch64-linux-gnu/7.5.0/lto-wrapper
目标:aarch64-linux-gnu
配置为:‘/home/tcwg-buildslave/workspace/tcwg-make-release_0/snapshots/gcc.git~linaro-7.5-2019.12/configure’ SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --with-system-zlib --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-arch=armv8-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/sysroots/aarch64-linux-gnu --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu/aarch64-linux-gnu/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=aarch64-linux-gnu --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release_0/_build/builds/destdir/x86_64-unknown-linux-gnu
线程模型:posix
gcc 版本 7.5.0 (Linaro GCC 7.5-2019.12)
3.在x86上编译arm64的mpp库
3.1 拉取代码
git clone https://github.com/rockchip-linux/mpp.git
3.2 配置工具链
cd mpp/build/linux/aarch64
bash make-Makefiles.bash
3.3 编译
make -j4
编译成功后,在linux系统下将mpp文件夹压缩才能拖到windows系统上,直接拉的话文件夹中的动态链接库会失效,后面使用mpp库就直接把这个压缩包拉到板子上解压使用就行了。