3、基础裁剪配置:make menuconfig入门、选择目标架构(ARM/MIPS/RISC-V)、配置静态编译与动态编译
好,咱们正式开始动手了。这一节,我带你走一遍 BusyBox 裁剪最核心的步骤——make menuconfig。说白了,这就是一个图形化的配置界面,你在这里勾勾选选,就能决定最终生成的 busybox 二进制文件有多大、支持哪些命令。
我第一次接触这个界面的时候,说实话有点懵。满屏的选项,不知道从哪下手。后来做项目多了,慢慢摸出了门道。今天我就把这几步关键操作拆开揉碎了讲给你听。
3.1 make menuconfig 入门
进入 BusyBox 源码目录后,执行:
make menuconfig
你会看到一个蓝底白字的界面。别被它吓到,操作其实很简单:
- 方向键:上下移动光标
- Enter:进入子菜单或选中选项
- 空格键:切换选项状态(
[*]表示编译进内核,[M]表示编译为模块,但 BusyBox 里通常只有[*]和[ ]) - Esc + Esc:返回上一级菜单
- /?:搜索某个配置项
/ 键搜索 "ash" 或者 "vi"。为啥?因为这两个工具我几乎天天用。先确认它们被勾选了,心里才踏实。
这个界面背后,实际上是在修改源码根目录下的 .config 文件。你每勾选或取消一个选项,.config 里对应的 CONFIG_XXX=y 或 # CONFIG_XXX is not set 就会变化。
.config 文件!格式很严格,少个空格都可能出问题。老老实实用 menuconfig 操作,这是过来人的忠告。
3.2 选择目标架构:ARM / MIPS / RISC-V
进入 menuconfig 后,第一件大事就是设置目标架构。路径是:
Busybox Settings --->
Build Options --->
[ ] Build BusyBox as a static binary (no shared libs)
(arm) Cross Compiler prefix
(arm) Architecture
这里要改两个地方:
- Architecture:选择你的 CPU 架构。常见的有
arm、mips、riscv、i386、x86_64等。 - Cross Compiler prefix:交叉编译工具链的前缀。比如你用 arm-linux-gnueabihf-gcc,那这里就填
arm-linux-gnueabihf-。
我举个例子。假设你手头有个海思的摄像头方案,芯片是 ARM Cortex-A7,那你的配置大概是:
| 配置项 | 值 |
|---|---|
| Architecture | arm |
| Cross Compiler prefix | arm-hisiv500-linux- |
如果是 RISC-V 的开发板,比如 SiFive 的 HiFive Unleashed,那就改成:
| 配置项 | 值 |
|---|---|
| Architecture | riscv |
| Cross Compiler prefix | riscv64-unknown-linux-gnu- |
3.3 静态编译 vs 动态编译
这是新手最容易纠结的地方。咱们来捋一捋。
在 Build Options 菜单里,有一个选项:
[*] Build BusyBox as a static binary (no shared libs)
勾上它,就是静态编译。不勾,就是动态编译。
静态编译的特点
- 所有依赖的库(比如 libc)都打包进 busybox 二进制文件里
- 文件体积大,通常 800KB ~ 1.2MB
- 不依赖目标板上的动态库,扔上去就能跑
- 适合嵌入式环境,尤其是根文件系统很小、库不全的情况
动态编译的特点
- 依赖目标板上的动态库(如 libc.so.6、ld-linux.so.3)
- 文件体积小,通常 200KB ~ 400KB
- 如果目标板的库版本不匹配,会报 "cannot open shared object file"
- 适合库环境比较标准的 Linux 系统
我个人怎么选?看场景。
如果是在一个全新的板子上做 bring-up,根文件系统里可能连 libc 都没有,那我肯定选静态编译。省心,一个 busybox 文件搞定所有。
如果是在一个成熟的系统上做替换,比如 OpenWrt 路由器,那动态编译就够了。体积小,升级也方便。
3.4 本章知识体系
下面这张图,是我自己总结的 BusyBox 基础裁剪流程。你照着这个思路走,基本不会跑偏。
这张图把咱们今天讲的三步串起来了。你记住:先进入 menuconfig,再选架构,最后定编译方式。顺序别搞反了。
3.5 实战小贴士
最后,分享几个我在项目中积累的经验:
- 第一次配置时,先别急着裁剪。 先把所有选项都默认,只改架构和编译方式,编译出一个完整的 busybox 试试。确认能跑起来,再开始砍功能。
- 每次修改配置后,记得保存。 menuconfig 退出时会问你是否保存,选 Yes。或者直接按
Exit直到退出,也会提示保存。 - 备份你的 .config 文件。 我习惯把调好的配置命名为
config_arm_static或config_mips_dynamic,下次直接cp过来用,省得重新配。
好了,这一节的内容就到这儿。你打开终端,进到 BusyBox 源码目录,敲一遍 make menuconfig,亲手试试这些操作。光看是学不会的,动手才是硬道理。