3. 基础配置:make menuconfig 界面导航、Target options 配置详解、Toolchain 选择
说实话,很多新手拿到 Buildroot 第一件事就是直接 make,然后等着报错。我当年也干过这事,结果编译到一半卡住,查了半天才发现是 Target architecture 选错了。
这一章咱们就老老实实把基础配置捋清楚。你只要把 make menuconfig 里的这几项搞明白,后面基本不会出大乱子。
3.1 make menuconfig 界面导航
运行 make menuconfig 后,你会看到一个蓝底白字的界面。这玩意儿跟 Linux 内核的配置界面长得一模一样,操作逻辑也完全一致。
- ↑ / ↓:上下移动光标
- Enter:进入子菜单
- Space 或 Y / N:切换选项状态(选中/取消)
- ?:查看当前选项的帮助信息
- /:搜索功能,按关键字找配置项
- Esc + Esc:返回上一级或退出
我个人习惯先把 / 搜索功能记住。项目大了之后,配置项几百个,你一个个翻菜单会疯掉的。比如你想找 "openssh",直接按 / 输入 openssh,回车就能定位到。
<Select>、<Exit>、<Help>。用 Tab 键可以在按钮之间切换,别傻傻地只按方向键。
3.2 Target options 配置详解
进入 Target options,这里是整个系统的根基。说白了,你得告诉 Buildroot:你的板子是什么架构、什么 CPU、什么浮点单元。搞错了,编译出来的东西根本跑不起来。
我遇到过最典型的案例:有人拿 ARM Cortex-A7 的板子,结果 Target Architecture Variant 选了 cortex-a9。编译倒是过了,但系统启动到一半就崩了。为什么?因为指令集不兼容。
3.2.1 关键配置项一览
| 配置项 | 说明 | 常见取值 |
|---|---|---|
| Target Architecture | 目标 CPU 架构 | ARM、ARM64、x86、x86_64、MIPS、RISC-V |
| Target Architecture Variant | 具体 CPU 型号或内核版本 | cortex-a7、cortex-a53、nehalem、skylake |
| Target ABI | 应用程序二进制接口 | EABI、EABIhf(ARM 下常用) |
| Floating point strategy | 浮点运算策略 | VFPv4-D16、NEON、Soft float |
| ARM instruction set | ARM 指令集模式 | ARM、Thumb、Thumb2 |
3.2.2 浮点策略:最容易踩的坑
嗯,这里要重点说一下。Floating point strategy 选错了,你的程序要么跑得极慢,要么直接报非法指令。
- Soft float:用软件模拟浮点运算。兼容性最好,但性能最差。如果你的 CPU 没有硬件浮点单元,只能选这个。
- VFPv4-D16 / NEON:硬件浮点。性能好,但要求 CPU 必须支持对应的指令集。
我曾经在一个全志 H3 的板子上,默认选了 Soft float,结果视频解码卡成 PPT。后来查了芯片手册,发现它支持 NEON,改过来之后性能直接翻倍。
3.2.3 ABI 选择:EABI vs EABIhf
ARM 架构下,ABI 选项直接影响浮点参数的传递方式。
- EABI:浮点参数通过整数寄存器传递。兼容老内核和 bootloader。
- EABIhf:浮点参数通过浮点寄存器传递。性能更好,但要求整个软件栈(内核、bootloader、所有库)都支持硬浮点。
如果你选了 EABIhf,但内核是用 EABI 编译的,那系统根本起不来。我踩过这个坑,折腾了两天才发现是 ABI 不匹配。
3.3 Toolchain 选择:内建 vs 外部
Toolchain 就是你的编译工具链。Buildroot 给你两条路:自己编译(内建),或者用现成的(外部)。
3.3.1 内建 Toolchain
选 Buildroot toolchain,Buildroot 会从源码编译 GCC、binutils、glibc/uClibc/musl 等全套工具。好处是版本、补丁、优化参数全由你掌控。
但代价是什么?我第一次编译内建 toolchain,在 i5 笔记本上跑了整整 40 分钟。那段时间我喝了两杯咖啡,刷了一圈新闻,它还在编译。
host/ 目录,里面装着交叉编译器。如果你改了内核版本或 C 库,最好 make clean 后重新编译,否则容易出现链接错误。
3.3.2 外部 Toolchain
选 External toolchain,你可以用 Linaro、ARM 官方、或者芯片厂商提供的预编译工具链。说白了就是拿来主义,省时间。
配置外部 toolchain 时,你需要指定:
- Toolchain path:工具链的安装路径
- Toolchain prefix:比如
arm-linux-gnueabihf- - External toolchain C library:必须与实际工具链匹配,选错了编译会报
cannot find -lc
releases.linaro.org 下载对应架构的版本,解压后把路径填进去就行。我项目里 80% 的情况都用外部 toolchain,只有需要定制 glibc 线程模型或启用特定 GCC 插件时才用内建。
3.3.3 如何选择?
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 快速原型验证 | 外部 Toolchain | 省去编译时间,快速出镜像 |
| 产品量产 | 内建 Toolchain | 版本可控,安全补丁可追溯 |
| 需要特定 GCC 版本 | 外部 Toolchain | 直接下载对应版本,不用自己编译 |
| 定制 C 库(如 musl) | 内建 Toolchain | 外部工具链很少提供 musl 版本 |
你想想看,如果你的项目周期只有两周,你愿意花半天去编译 toolchain 吗?反正我不愿意。先用外部工具链跑起来,后面再换内建也不迟。
make savedefconfig 保存配置,方便回溯。