3、基础配置:make menuconfig入门、Target options配置、Build options配置、Toolchain配置
说实话,很多新手拿到 Buildroot 第一件事就是直接 make,然后等着它报错。我当年也干过这事——结果编译到一半卡住了,日志刷了几万行,根本不知道哪里出了问题。
后来我学乖了。Buildroot 的配置,说白了就是三个核心模块:目标平台、构建行为、工具链。这三块没配好,后面全是白搭。
3.1 make menuconfig 入门
先跑一下这个命令:
$ cd buildroot/
$ make menuconfig
你会看到一个蓝底黄字的界面。嗯,跟 Linux 内核的配置界面长得一模一样。操作方式也完全一样:
- 方向键:上下移动光标
- Enter:进入子菜单
- Y / N:启用/禁用某个选项
- 空格:循环切换状态
- /?:查看帮助和依赖关系
- Tab:跳到底部按钮(Save / Exit)
/? 看一眼依赖项。Buildroot 的依赖链有时候挺绕的,少选一个依赖,编译到一半才报错,那才叫头疼。
配置保存后,会生成一个 .config 文件。这个文件就是 Buildroot 的“灵魂”——所有后续的编译行为都基于它。我个人习惯把 .config 备份一份,叫 config_20250326 之类的,方便回滚。
3.2 Target options 配置
进入 Target options,这里定义的是你的硬件平台。说白了,就是告诉 Buildroot:“我要给哪个芯片做系统?”
| 配置项 | 说明 | 常见值 |
|---|---|---|
| Target Architecture | CPU 架构 | ARM / AArch64 / x86_64 / RISC-V |
| Target Architecture Variant | 具体型号变体 | cortex-a7 / cortex-a53 / neoverse-n1 |
| Target ABI | 应用二进制接口 | EABI / EABIhf(硬浮点) |
| Target Floating Point | 浮点运算单元 | VFPv3 / VFPv4 / NEON |
| Target Endianness | 字节序 | Little endian / Big endian |
教训:浮点和 SIMD 选项一定要跟芯片手册对一遍,别想当然。
举个例子,如果你用的是树莓派 4(BCM2711,Cortex-A72):
Target Architecture → AArch64
Target Architecture Variant → cortex-a72
Target ABI → EABI
Target Floating Point → NEON
Target Endianness → Little endian
配错了会怎样?轻则性能打折,重则编译出来的程序根本跑不起来。我见过有人把 ARM 的 EABI 选成 EABIhf,结果系统启动到一半就崩了——因为内核和用户空间的浮点调用约定不一致。
3.3 Build options 配置
这个菜单控制的是“怎么编译”,而不是“编译什么”。说白了,就是构建过程的参数调优。
- Build output location:输出目录。默认是
output/,我习惯改成output_${BOARD_NAME},方便多项目并行。 - Number of jobs to run simultaneously:并行编译线程数。建议设为
CPU核心数 + 1。比如 4 核 CPU 就填5。 - Enable compiler cache:启用 ccache。强烈建议打开,第二次编译能快 50% 以上。
- Enable build with debugging symbols:调试符号。开发阶段打开,发布时关掉,能省不少空间。
- Strip target binaries:去除调试信息。建议打开,能减小 rootfs 体积 20%~30%。
我的经验:调试阶段我一般这样配:
- ccache = 开
- debug symbols = 开
- strip = 关
- jobs = n+1
等要发布固件了,再反过来:关 debug、开 strip、重新编译一次。这样既保证了开发效率,又控制了最终镜像的大小。
3.4 Toolchain 配置
工具链,就是编译器、链接器、C 库这些东西的集合。Buildroot 给你三个选择:
| 选项 | 说明 | 适用场景 |
|---|---|---|
| Buildroot toolchain | Buildroot 自己编译工具链 | 从零开始,完全可控 |
| External toolchain | 使用预编译的工具链 | 快速验证、兼容已有 SDK |
| Internal toolchain (custom) | 自定义内核头文件版本等 | 需要特定内核 API 版本 |
我个人推荐:新手先用 Buildroot toolchain。为什么?因为省心。Buildroot 会自动下载匹配的 gcc、binutils、glibc/uclibc/musl,版本依赖关系都帮你处理好了。
如果你选 External toolchain,需要指定路径和前缀:
Toolchain path → /opt/arm-gcc-10.3
Toolchain prefix → arm-linux-gnueabihf-
External toolchain C library → glibc / uclibc / musl
GLIBC_2.32 not found。嗯,这种问题排查起来特别费时间。
还有一个容易被忽略的选项:Kernel Headers。它决定了工具链能支持哪些内核系统调用。我建议选跟目标内核版本最接近的。比如你的内核是 5.10,就选 Linux 5.10.x kernel headers。选太老的版本,某些新系统调用会编译不过;选太新的,又可能引入不兼容的 ABI 变化。
3.5 配置流程总览
下面这张图,是我自己总结的配置顺序。按这个流程走,基本不会漏东西:
嗯,这张图其实是我自己画在小白板上的。每次配新板子,我就按这个顺序过一遍,基本没出过问题。
3.6 配置后的检查
保存退出后,我建议你手动看一眼 .config 文件:
$ grep -E "^(BR2_ARCH|BR2_TOOLCHAIN|BR2_CCACHE)" .config
输出应该类似:
BR2_ARCH="aarch64"
BR2_TOOLCHAIN_BUILDROOT=y
BR2_CCACHE=y
如果发现 BR2_ARCH 跟你预期的不一样,别急着编译,回去重新配。这一步检查花不了 30 秒,但能省下你后面几个小时的排错时间。
.config 文件纳入版本管理(git)。每次改配置都 commit 一次,备注里写清楚改了啥。这样万一新配置出了问题,你可以快速 git diff 对比差异,找到是哪一项改坏了。