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里。
步骤:
- 打开终端,编辑配置文件:
vim ~/.bashrc - 在文件末尾添加:
export CROSS_COMPILE=arm-linux-gnueabihf-
export CC=${CROSS_COMPILE}gcc
export PATH=$PATH:/usr/bin
- 保存退出,执行:
source ~/.bashrc - 验证:
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 本章知识体系
下面这张图帮你理清整个流程:
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程序也跑通了。接下来,咱们就可以开始真正的嵌入式测试环境搭建了。