4、外部工具链配置:用 Linaro GCC 还是 ARM GCC?
工具链这东西,说白了就是交叉编译的“翻译官”。你在一台 x86 的电脑上,要给 ARM 板子生成可执行文件,没有它可不行。Buildroot 默认会自己下载并编译一套工具链,但这个过程挺耗时间的。我个人习惯,只要条件允许,都用外部预编译好的工具链——省时、省心,版本也稳定。
这一节,我们就来聊聊怎么把 Linaro GCC、ARM GCC 这类外部工具链“塞”进 Buildroot,并且确保它真的能用。
4.1 为什么我推荐用外部工具链?
你可能会问:“Buildroot 自己编译工具链不好吗?” 好,但慢。我第一次用 Buildroot 编译完整系统时,光等工具链编译就花了快两个小时。后来换成 Linaro 的预编译工具链,整个流程缩短到 20 分钟。
外部工具链的好处很明显:
- 节省编译时间:预编译好的,拿来就用。
- 版本可控:Linaro、ARM 官方发布的版本,经过充分测试。
- 调试方便:配套的 gdb、gdbserver 都是现成的。
4.2 外部工具链的两种主流选择
目前市面上最常见的就是 Linaro GCC 和 ARM GCC。它们有什么区别?我整理了一个表格,你一看就明白。
| 特性 | Linaro GCC | ARM GCC (GNU Arm Embedded) |
|---|---|---|
| 维护方 | Linaro 社区(基于 ARM 贡献) | ARM 官方 |
| 目标架构 | ARM (A系列为主,也支持M/R) | ARM Cortex-M/R (裸机/RTOS) |
| 典型前缀 | aarch64-linux-gnu- 或 arm-linux-gnueabihf- |
arm-none-eabi- |
| 适用场景 | Linux 用户空间 + 内核 | 裸机程序、RTOS、无操作系统 |
| 是否带 Linux 库 | 是(glibc/uClibc) | 否(只提供 newlib) |
简单来说:你要做 Linux 系统,选 Linaro GCC。你要做单片机裸机开发,选 ARM GCC。我们这课程主要讲 Linux,所以后面都以 Linaro 为例。
4.3 配置外部工具链的步骤
配置过程其实不复杂,但有几个关键点容易踩坑。我一步步带你走。
4.3.1 下载并解压工具链
先去 Linaro 官网下载对应架构的预编译工具链。比如我常用的:
# 下载 ARM 32位工具链(带硬浮点)
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
# 解压到 /opt 目录
sudo tar -xf gcc-linaro-*.tar.xz -C /opt/
4.3.2 在 Buildroot 中配置外部工具链
进入 Buildroot 配置界面:
make menuconfig
找到 Toolchain 菜单,按以下步骤设置:
- Toolchain type → 选择
External toolchain - Toolchain → 选择
Custom toolchain - Toolchain path → 填入你的工具链路径,比如
/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf - Toolchain prefix → 填入
arm-linux-gnueabihf - External toolchain gcc version → 选择对应的版本,比如
7.x - External toolchain kernel headers series → 这个要和你工具链自带的头文件版本匹配,一般选
4.x或5.x - External toolchain C library → 选
glibc(Linaro 默认带的是 glibc)
关键参数对照表:
| 配置项 | 示例值 | 说明 |
| Toolchain path | /opt/gcc-linaro-7.5.0-... | 工具链的根目录 |
| Toolchain prefix | arm-linux-gnueabihf | 编译器的前缀名 |
| External toolchain gcc version | 7.x | 必须和实际版本一致 |
| External toolchain kernel headers | 4.10 | 查看工具链中 usr/include/linux/version.h |
4.3.3 验证工具链正确性
配置完别急着编译。先手动验证一下工具链能不能用。
# 检查编译器版本
/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc --version
# 编译一个简单的测试程序
echo 'int main(){ return 0; }' > test.c
/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc -o test test.c
# 查看生成的文件类型
file test
# 输出应该类似:ELF 32-bit LSB executable, ARM, version 1 (SYSV)
如果 file 命令显示的是 ARM 架构的可执行文件,那就说明工具链工作正常。
PATH 环境变量里,这样就不用每次都写完整路径了。
4.4 常见问题与避坑指南
配置外部工具链时,有几个坑我踩过,你注意避开。
- 内核头文件版本不匹配:Buildroot 会检查工具链自带的内核头文件版本。如果和你配置的不一致,会报错。解决办法是查看工具链中
usr/include/linux/version.h文件,找到LINUX_VERSION_CODE,然后换算成版本号。 - C 库类型选错:Linaro 默认用 glibc,如果你选了 uClibc,编译会失败。不确定的话,用
readelf -l /path/to/toolchain/lib/libc.so | grep interpreter查看。 - 工具链路径写错:路径最后不要加斜杠,也不要包含空格。我见过有人把路径写成了
/opt/toolchain/,结果 Buildroot 找不到bin目录。
4.5 知识体系结构图
下面这张图帮你理清外部工具链配置的核心逻辑:
这张图把整个流程串起来了。你按照这个顺序走,基本不会出大问题。
4.6 小结
外部工具链配置,说白了就是三步:下载、配置、验证。其中验证这步很多人会跳过,但我建议你每次换工具链都跑一遍。毕竟,工具链不对,后面编译出来的系统全是废的。
嗯,这一节就到这里。记住,工具链是根文件系统的“地基”,地基稳了,上面盖楼才放心。