4. 搭建交叉编译环境:安装ARM GCC工具链、配置环境变量、编写第一个交叉编译程序(Hello World)、验证编译结果

好,咱们正式开始动手了。这一章要解决一个核心问题:怎么让你的PC能编译出ARM芯片能跑的程序。

说白了,你的电脑是x86架构,ARM开发板是ARM架构。你直接在PC上gcc编译出来的东西,板子不认识。这时候就需要交叉编译工具链——在PC上运行,但生成ARM机器码的编译器。

核心概念:交叉编译 = 在A平台上编译,生成B平台可执行文件。我们这里A=x86 PC,B=ARM Linux。

4.1 安装ARM GCC工具链

我个人习惯用gcc-arm-linux-gnueabihf这个版本。它支持硬件浮点,性能更好。如果你的板子比较老,也可以用gcc-arm-linux-gnueabi(软浮点)。

Ubuntu/Debian系统安装命令:

sudo apt update
sudo apt install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf

安装完成后,验证一下:

arm-linux-gnueabihf-gcc --version

如果看到版本号输出,说明装好了。没看到?检查网络,或者换源试试。

小提示:我在项目中遇到过,有些同学装的是gcc-arm-none-eabi,那是给裸机用的,没有Linux库支持。咱们做嵌入式Linux测试,一定要装带linux或gnueabihf的版本。

4.2 配置环境变量

工具链装好了,但每次敲一长串名字挺烦的。我建议把路径加到~/.bashrc里。

步骤:

  1. 打开终端,编辑配置文件:vim ~/.bashrc
  2. 在文件末尾添加:
export CROSS_COMPILE=arm-linux-gnueabihf-
export CC=${CROSS_COMPILE}gcc
export PATH=$PATH:/usr/bin
  1. 保存退出,执行:source ~/.bashrc
  2. 验证:echo $CC 应该输出 arm-linux-gnueabihf-gcc

注意:我曾经因为忘记source,折腾了半小时以为环境变量没生效。嗯,记得刷新一下。

4.3 编写第一个交叉编译程序(Hello World)

写一个最简单的C程序,验证工具链是否正常工作。

创建文件 hello.c:

#include <stdio.h>

int main() {
    printf("Hello from ARM Linux!\n");
    printf("Cross-compilation works!\n");
    return 0;
}

编译命令:

arm-linux-gnueabihf-gcc -o hello hello.c

编译完成后,用file命令查看生成的文件:

file hello

输出应该类似:

hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, not stripped

看到ARM字样了吗?说明编译成功了。

关键检查点:如果显示的是x86-64,说明你用了本机的gcc,不是交叉编译器。检查一下命令有没有输错。

4.4 验证编译结果

光看file输出还不够,咱们得确认它真的能在ARM板子上跑。

方法一:用QEMU模拟运行(没有板子时)

sudo apt install qemu-user-static
./hello

如果看到:

Hello from ARM Linux!
Cross-compilation works!

说明程序逻辑没问题。

方法二:传到开发板运行

用scp或U盘把hello文件传到板子上:

scp hello root@192.168.1.100:/root/

然后在板子上执行:

chmod +x hello
./hello

避坑指南:我曾经遇到一个情况——板子上报./hello: not found。明明文件在啊?后来发现是动态链接库路径不对。用readelf -d hello查看依赖,然后检查板子上有没有对应的ld-linux-armhf.so.3。没有的话,要么装库,要么静态编译:

arm-linux-gnueabihf-gcc -static -o hello hello.c

4.5 本章知识体系

下面这张图帮你理清整个流程:

交叉编译环境搭建流程 PC x86 主机 安装ARM GCC工具链 配置环境变量 编写Hello World 交叉编译 验证编译结果 验证方法 方法一:QEMU模拟运行(无板子时) 方法二:scp传到开发板运行 常见问题:动态链接库缺失 → 改用静态编译

4.6 常见问题与排查

问题现象 可能原因 解决方法
command not found 工具链未安装或路径未配置 检查安装命令,重新source ~/.bashrc
file显示x86架构 用了本机gcc,不是交叉编译器 确认使用arm-linux-gnueabihf-gcc
板子上报not found 动态链接库缺失 加-static静态编译,或安装对应库
编译报错stdio.h: No such file 缺少头文件或库 安装libc6-dev-armhf-cross

重要提醒:交叉编译环境是后续所有测试工作的基础。环境没搭好,后面全是白费功夫。我建议你搭好之后,用hello程序完整跑一遍流程,确认无误再往下走。

好了,这一章的内容就到这儿。工具链装好了,环境变量配好了,第一个ARM程序也跑通了。接下来,咱们就可以开始真正的嵌入式测试环境搭建了。