4、配置BusyBox:make menuconfig详解、选择需要的Applet、配置编译选项(静态/动态链接)
好,咱们接着往下走。上一节我们把BusyBox源码拉下来了,也验证了基础编译没问题。但说实话,那个默认配置就是个「大礼包」,啥都给你塞进去。真正做产品,你得学会「做减法」——只留你需要的,砍掉没用的。
这一节,我就带你手把手过一遍 make menuconfig 的配置界面。我会告诉你哪些选项是坑,哪些是宝,以及静态链接和动态链接到底怎么选。
4.1 启动配置界面
在BusyBox源码根目录下,执行:
make menuconfig
如果你是在干净的Ubuntu环境里第一次跑,可能会报错说缺少 ncurses-dev。别慌,装一下就好:
sudo apt-get install libncurses5-dev
装完再跑,就能看到一个蓝底白字的配置界面了。嗯,这界面跟Linux内核的配置界面长得一模一样,毕竟都是同门师兄弟。
4.2 配置界面的基本操作
我个人习惯用键盘操作,鼠标在这界面里基本没用。记住这几个快捷键就行:
- 上下方向键:移动光标,选择菜单项
- Enter:进入子菜单或确认选择
- 空格键:切换选项状态(
[*]选中,[ ]取消) - Y / N:快速选中或取消
- ? 键:查看当前选项的帮助信息
- Esc + Esc:返回上一级菜单
- / 键:搜索功能,找Applet特别方便
/ 键输入 ls,能直接定位到 ls 这个Applet的配置位置。我在项目中经常用这招,比一层层翻菜单快多了。
4.3 选择需要的Applet
配置界面的主菜单里,最核心的就是 BusyBox Settings → 下面的 Applets 子菜单。这里按功能分了十几个大类:
| 分类 | 典型Applet | 说明 |
|---|---|---|
| Coreutils | cat, cp, mv, rm, ls, mkdir | 文件操作基本命令,几乎必选 |
| Shells | ash, hush, msh | Shell解释器,至少选一个 |
| Networking | ping, ifconfig, wget, telnetd | 网络相关工具,按需选择 |
| Linux System Utilities | mount, umount, dmesg, init | 系统管理工具,init必选 |
| Process Utilities | ps, top, kill, free | 进程管理,调试时很有用 |
| Editors | vi, sed, awk | 文本编辑,嵌入式环境建议选sed和awk |
你想想看,一个路由器只需要网络相关的命令,根本不需要 vi 编辑器。但如果你做的是工业控制面板,可能就需要 vi 来现场改配置。
4.4 配置编译选项
回到主菜单,进入 BusyBox Settings → Build Options。这里有几个关键选项,直接决定你的BusyBox能不能跑起来。
4.4.1 静态链接 vs 动态链接
这是新手最容易纠结的问题。说白了就是:
- 静态链接:把所有用到的库函数都编译进BusyBox里,生成的文件大,但独立运行,不依赖外部库。
- 动态链接:BusyBox只记录函数地址,运行时去系统库(如glibc或uClibc)里找,文件小,但依赖库环境。
在配置界面里,这个选项叫:
[*] Build BusyBox as a static binary (no shared libs)
选中就是静态链接,不选就是动态链接。
No such file or directory。我曾经在移植时踩过这个坑,折腾了半天才发现是库版本不匹配。
我个人建议:嵌入式环境优先用静态链接。原因很简单:
- 你不需要操心目标板上的库版本
- BusyBox本身不大,静态链接也就几百KB到1MB左右
- 部署时只需要拷贝一个文件,省心
但如果你做的是桌面环境或者容器场景,动态链接更合适,因为可以共享系统库,节省内存。
4.4.2 交叉编译工具链设置
在 Build Options 里,你还需要指定交叉编译器:
Cross Compiler prefix
(arm-linux-gnueabihf-)
这里填你的工具链前缀。比如我用的是ARM Cortex-A7的板子,就填 arm-linux-gnueabihf-。注意后面要带横杠。
如果你不填,默认用本机的gcc编译,那编译出来的BusyBox只能在你的PC上跑,放到ARM板子上肯定不行。
4.4.3 其他重要选项
| 选项 | 推荐值 | 说明 |
|---|---|---|
| Path to sysroot | 工具链的sysroot路径 | 指定头文件和库的搜索路径 |
| Additional CFLAGS | -Os -march=armv7-a | 优化选项,-Os是尺寸优化 |
| Enable debug build | 不选 | 调试用,生产环境别开,会增大体积 |
4.5 知识体系结构图
下面这张图,是我梳理的BusyBox配置核心逻辑。你看一眼,心里就有谱了:
4.6 保存配置与编译
配置完成后,按 Exit 退出,系统会问你是否保存。选 Yes,配置会写入 .config 文件。
然后直接编译:
make -j4
编译完成后,在当前目录下会生成一个 busybox 可执行文件。你可以用 file 命令看看它是什么架构的:
file busybox
# 输出示例:busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked
看到 statically linked 了吗?说明你配置的静态链接生效了。
busybox --list-full 可以列出所有编译进去的Applet。我每次改完配置都会跑一下这个命令,确认我需要的命令都在,不需要的确实被砍掉了。
嗯,到这里,BusyBox的配置环节就讲完了。你可能会觉得选项很多,但核心就三件事:选对Applet、选对链接方式、选对交叉编译器。把这三点拿捏住,剩下的都是锦上添花。
可可精品资料库