构建树莓派交叉编译环境(基于虚拟机ubuntu18)
首先,建议在root用户下进行环境搭建,因为有些指令操作的目录权限只有root用户才有,而环境变量添加是按照用户添加的,构建交叉编译环境的过程中使用su 指令获取root用户权限的时候会将之前加入的环境变量清空,导致找不到相关文件。
树莓派采用64位ubuntu20系统
一、搭建交叉编译工具
下载对应树莓派版本的相关软件包
在树莓派上使用如下命令进行查看版本信息
1.Binutils版本 ld -v 本机2.34
2.GCC版本 gcc -v 本机9.4.0
3.GLIBC版本 ldd --version 本机2.31
4.树莓派linux内核版本 uname -a 本机5.4.0-1085-raspi
上国内镜像资源网站下载对应版本上述资源(这里使用清华镜像)在下述地址下载1-3
https://mirrors.tuna.tsinghua.edu.cn/gnu
在树莓派官网下载相应版本Linux内核
https://github.com/raspberrypi/linux
2.将下载好的压缩包放到虚拟机ubuntu的文件夹下
我们在用户的home目录下新建gcc_all文件夹用于存放相关文件
1 cd ~
2 mkdir gcc_all && cd gcc_all
然后将压缩包拖进去(用鼠标托。。别问我怎么托),解压压缩包
1
tar xf binutils-2.34.tar.bz2
2 tar xf glibc-2.31.tar.bz2
3 tar xf gcc-9.4.0.tar.gz
4.unzip linux-rpi-5.4.y.zip
3.在GCC文件夹中下载prerequisite
1 cd gcc-9.4.0
2 contrib/download_prerequisites
4.在opt目录下创建文件夹用于存放交叉编译工具(opt文件是我们存放用户自定义文件的地方)然后将文件路径添加到环境变量中(不添加后续编译会报错)
1 cd ~/gcc_all
2 sudo mkdir -p /opt/cross-pi-gcc
3 sudo chown $USER /opt/cross-pi-gcc
4 export PATH=/opt/cross-pi-gcc/bin:$PATH
5.复制内核头文件
1
cd ~/gcc_all
2 cd linux
3 KERNEL=kernel7
4 make ARCH=arm INSTALL_HDR_PATH=/opt/cross-pi-gcc/arm-linux-gnueabihf headers_install
6.构建binutils
1 cd ~/gcc_all
2 mkdir build-binutils && cd build-binutils
3 ../binutils-2.34/configure --prefix=/opt/cross-pi-gcc --target=arm-linux-gnueabihf --with-arch=armv6 --with-fpu=vfp --with-float=hard --disable-multilib
4 make -j 8
5 make install
7.构建部分gcc
1 cd ~/gcc_all
2 mkdir build-gcc && cd build-gcc
3 ../gcc-9.4.0/configure --prefix=/opt/cross-pi-gcc --target=arm-linux-gnueabihf --enable-languages=c,c++,fortran --with-arch=armv6 --with-fpu=vfp --with-float=hard --disable-multilib
4 make -j8 all-gcc
5 make install-gcc
8.构建glibc
1 cd ~/gcc_all
2 mkdir build-glibc && cd build-glibc
3 ../glibc-2.31/configure --prefix=/opt/cross-pi-gcc/arm-linux-gnueabihf --build=$MACHTYPE --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --with-arch=armv6 --with-fpu=vfp --with-float=hard --with-headers=/opt/cross-pi-gcc/arm-linux-gnueabihf/include --disable-multilib libc_cv_forced_unwind=yes
4 make install-bootstrap-headers=yes install-headers
5 make -j8 csu/subdir_lib
6 install csu/crt1.o csu/crti.o csu/crtn.o /opt/cross-pi-gcc/arm-linux-gnueabihf/lib
7 arm-linux-gnueabihf-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /opt/cross-pi-gcc/arm-linux-gnueabihf/lib/libc.so
8 touch /opt/cross-pi-gcc/arm-linux-gnueabihf/include/gnu/stubs.h
9.回到gcc编译
1 cd ..
2 cd build-gcc
3 make -j8 all-target-libgcc
4 make install-target-libgcc
10.完成glibc编译
1 cd ..
2 cd build-glibc
3 make -j8
4 make install
11.完成GCC交叉编译工具9.4.0搭建
1 cd ..
2 cd build-gcc
3 make -j8
4 make install
二、测试交叉编译工具
写一个hello,world程序 c/c++都可以(这个自己写。。)
arm-linux-gnueabihf-g++/gcc test.cpp/c -o test
我用的C++所以执行如下:
arm-linux-gnueabihf-g++ hello.cpp -o hello
将生成的二进制文件,复制到树莓派上(使用xftp或者u盘都可以)
chmod +x 文件名 (添加可执行权限)
./文件名 (执行)
输出hello,world 则交叉编译工具搭建完成
三、可能遇到问题
将编译出的可执行文件放到树莓派上无法运行(报错 No such file or directory)
因为这个交叉编译工具是32位的 如果树莓派的系统版本是64位则无法执行
解决方法:
1.采用静态编译:加入 - static 关键字
arm-linux-gnueabihf-g++ hello.cpp -static -o hello
缺点:生成的可执行文件变得很大。。。。。
在进行交叉工具生成过程中出现权限不够:直接切换root用户(记得重新添加环境变量。)