跳到主要内容

交叉编译

交叉编译器 是一种在 主机平台(如 Ubuntu 或虚拟机)上运行,但用于生成 目标平台(如 ARM、MIPS 等架构)可执行文件的编译工具由于开发板资源有限,Buildroot 默认不支持本地编译 C 程序,因此需要使用交叉编译工具链。 由于开发板端的 Ubuntu 与 Buildroot 根文件系统基于不同工具链,用户需在 Ubuntu 22.04 的 PC 端选择对应的交叉编译器,编译后才能在目标系统上正常运行。

1. 准备工作

  1. 获取交叉编译工具链:

    版本描述下载
    glibcUbuntu 系统的交叉编译工具链需要在ARM官网上获取对应的交叉编译器下载
    uclibcBuildroot 系统的交叉编译工具链可在 SDK 中获取下载
  2. 解压对应压缩包:

    • Ubuntu 执行命令:

      #-C ~/ 指定解压路径为用户的主目录
      tar zxvf gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.gz -C ~/
    • Buildroot 执行命令:

      #-C ~/ 指定解压路径为用户的主目录
      tar zxvf arm-rockchip830-linux-uclibcgnueabihf.tar.gz -C ~/
  3. 以程序 hello.c 为例,编译出对应的可执行文件,文件执行效果是在终端上打印 hello world 。hello.c 代码如下:

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
    printf("hello world\n");
    return 0;
    }

2. 编译生成 Buildroot

[注意]

选择方式一/方式二中的一种即可生成对应文件

方式一:修改环境变量

  1. 设置交叉编译工具的环境变量,如果需要永久生效,编辑配置文件(如 .bashrc.profile )。

    vim ~/.bashrc
  2. 添加工具链路径,将交叉编译工具的路径添加到系统的 PATH 环境变量中:

    export PATH=/home/buildroot/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin:$PATH
    • 注意:请根据自己的 SDK 路径填写
  3. 更新环境变量,执行以下命令使配置生效。

    source ~/.bashrc
  4. 使用交叉编译工具编译程序。

    arm-rockchip830-linux-uclibcgnueabihf-gcc hello.c -o hello
  5. 最后将可执行文件传输到开发板。

    scp hello root@192.168.9.128:/root
    • 注意:请根据自己开发板的实际 IP 地址填写

方式二:使用Makefile

  1. 创建并编辑 Makefile 文件。

    vi Makefile
    • 注意:此 Makefile 需要创建在 hello.c 文件同级目录下
  2. 编写 Makefile 文件。

    #Luckfox-pico-ultra-w-buildroot
    CC := /home/buildroot/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc

    hello:hello.c
    -$(CC) $^ -o $@
    • 注意:请根据自己的 SDK 路径填写
  3. 执行 make 指令,将在当前目录下生成可执行文件。

    make
  4. 最后将可执行文件传输到开发板。

    scp hello root@192.168.9.128:/root
    • 注意:请根据自己开发板的实际 IP 地址填写

3. 编译生成 Ubuntu 系统下的可执行文件

注意:选择方式一/方式二中的一种即可生成对应文件。

方式一:修改环境变量

  1. 设置交叉编译工具的环境变量,如果需要永久生效,编辑配置文件(如 .bashrc .profile )。

    vim ~/.bashrc
  2. 添加工具链路径,将交叉编译工具的路径添加到系统的 PATH 环境变量中:

    export PATH=/home/ubuntu/luckfox-pico/gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf/bin:$PATH
    • 注意:请根据自己的 SDK 路径填写
  3. 更新环境变量,执行以下命令使配置生效。

    source ~/.bashrc
  4. 使用交叉编译工具编译程序。

    arm-none-linux-gnueabihf-gcc hello.c -o hello
  5. 最后将可执行文件传输到开发板。

    scp hello pico@192.168.9.128:/home/pico
    • 注意:请根据自己开发板的实际IP地址填写

方式二:使用 Makefile

  1. 创建并编辑 Makefile 文件。

    vi Makefile
    • 注意:此Makefile需要创建在 hello.c 文件同级目录下
  2. 编写 Makefile 文件。

    #Luckfox-pico-ultra-w-ubuntu
    CC := /home/ubuntu/luckfox-pico/gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc

    hello:hello.c
    -$(CC) $^ -o $@
    • 注意:请根据自己的SDK路径填写
  3. 执行 make 指令,将在当前目录下生成可执行文件。

    make
  4. 最后将可执行文件传输到开发板。

    scp hello pico@192.168.9.128:/home/pico
    • 注意:请根据自己开发板的实际 IP 地址填写

4. 运行可执行文件

  • Buildroot下执行:
    xxx
  • Ubuntu下执行:
    xxx