Linux-arm(树莓派4B)交叉编译

交叉编译介绍

  • 什么是交叉编译?

    • 交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

    • 在Window上编写C51代码,并编译生成可执行代码,如.hex,在C51上面运行,不是在Windows上运行(C51交叉编译发生在Keil(集成环境))

    • 在ubuntu上面编写树莓派的代码,并编译成可执行代码,如x.aot,是在树莓派上运行,不是在ubuntu Linux上运行(x86架构和arm架构不同)

  • 为什么要交叉编译?

    • 平台上不允许或不能安装我们所需的编译器比如C51

      • 因为目的平台上的资源匮乏,无法运行我们所需要的编译器
    • 树莓派是不是不需要交叉编译?

      • 错。也要:树莓派有时又是因为目的平台还没有建立,连操纵系统都没有,根本谈不上运行什么编译器(操作系统也是代码也需要编译)
      • 平台运行至少需要两样东西:bootloader(启动引导代码)以及操作系统核心
    • 宿主机(host)

      • 编辑和编译的平台,一般是基于x86的PC机。通常也被称为主机
    • 目标机(target)

      • 用户开发系统,通常都是非X86平台。host编译得到的可执行代码在target上运行

交叉编译工具链安装

  • 获取工具(该方法获取的交叉编译工具应该只能支持32位的arm,以下演示的也是只能编译出32位arm程序。64位arm另外补充)
  • 解压并找到找到需要的工具
    • unzip xxx.zip
    • cd tools-master
    • cd arm-bcm2708
    • 我的交叉编译平台是64位的所以选
    • 这是所需要的工具
  • 两种使用方式(我已经配置过了,仅作参考)
    • 临时有效(配置环境变量)
      • 显示当下环境变量echo $PATH
        • /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/theone/Desktop/lessonTool/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
      • 显示当前路径pwd
        • /home/theone/Desktop/lessonTool/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
      • 配置环境变量:
        • export PATH===/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:==/home/theone/Desktop/lessonTool/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
    • 永久有效
      • vi /home/theone/.bashrc(修改工作目录下的.bashrc)
        • 在最后一行加入
          • export PATH===/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:==/home/theone/Desktop/lessonTool/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
        • source /home/theone/.bashrc
  • 补充
    • 64位arm交叉编译工具(不知道有没有更新的,目前只找到这个)

    • 解压

      • tar -xvf gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz
    • 使用方法和上面32位arm的配置一样

      • 临时有效
        • 显示当下环境变量echo $PATH
          • /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/theone/Desktop/lessonTool/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
        • 显示当前路径pwd
          • /home/theone/Desktop/lessonTool/arm-64/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin
        • 配置环境变量
          • export PATH===/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:==/home/theone/Desktop/lessonTool/arm-64/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin
      • 永久有效
        • vi /home/theone/.bashrc(修改工作目录下的.bashrc)
          • 在最后一行加入
            • export PATH===/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:==/home/theone/Desktop/lessonTool/arm-64/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin
        • source /home/theone/.bashrc
    • 验证

      • aarch64-linux-gnu-gcc demo.c
        • 使用file指令查看产生的编译程序
      • 将程序传送到树莓派上:scp demo theone@192.168.x.x:/home/theone/Desktop
        • 运行结果:出现了GLIBC版本不匹配问题
          • 对于这个问题在网上找了很久,最后发现把树莓派上的libc库拿到ubuntu上作为指定链接库编译更为保守且简单(之前因为升级树莓派的GLIBC而导致树莓派指令无法正常使用导致最后重新刷机…)
          • 步骤
            • 来到树莓派根目录下/lib/aarch64-linux-gnu(我的是64位的,32位的名字有区别但结尾应该都是-gnu。想要的文件在这个文件夹里)
            • 将该文件夹中的libc.so.6传到ubuntu上:sudo scp libc.so.6 theone@192.168.x.x:/home/theone/Desktop/…
            • ubuntu上编译:
            • 编译生成的demo传到树莓派上:scp demo theone@192.168.x.x:/home/theone/Desktop
            • 运行成功
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trt_ToHoldOn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值