2、环境搭建:下载BusyBox源码、配置交叉编译工具链、首次编译体验
好,咱们正式开始动手。
上一章聊了BusyBox能干什么,这一章咱们直接落地。环境搭建这件事,说简单也简单,说坑也多。我这些年带过不少新人,十有八九卡在第一步——不是工具链没配好,就是源码版本选错了。
今天咱们一步步来,把环境搭稳了,后面才能跑得快。
2.1 下载BusyBox源码
源码去哪找?官方最稳。
我个人习惯直接从 BusyBox官网 或者 GitHub镜像 拉。别去第三方站点下,万一被植入了后门,你哭都来不及。
推荐版本策略:
- 稳定版(stable):适合产品量产,bug少
- 最新版(latest):适合学习新特性,但可能有坑
我一般选 1_36_stable 分支,够新也够稳。下载命令很简单:
# 方式一:从官网下载压缩包
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1/
# 方式二:从GitHub克隆(我推荐这个,方便切分支)
git clone git://busybox.net/busybox.git
cd busybox
git checkout 1_36_stable
下载完先看一眼目录结构。你执行 ls -l 会看到一堆文件夹:applets/、libbb/、networking/……每个目录对应一类工具。嗯,这里要注意,别手贱去删东西,后面编译时会用到。
2.2 配置交叉编译工具链
这是最容易翻车的地方。
什么叫交叉编译?说白了就是:在PC上编译,在ARM(或MIPS、RISC-V)上运行。你PC的gcc编译出来的是x86程序,放到嵌入式板子上跑不了——指令集都不一样。
常见坑:直接用 gcc 编译,然后拷到板子上说「怎么跑不了?」——我当年也干过这事。
你需要一套交叉编译工具链。常见选择:
| 工具链 | 适用场景 | 获取方式 |
|---|---|---|
| arm-linux-gnueabihf- | ARM Cortex-A系列 | Linaro、Buildroot |
| aarch64-linux-gnu- | ARM 64位(如树莓派3B+) | Linaro、Ubuntu源 |
| mipsel-linux-gnu- | MIPS小端架构 | Buildroot、OpenWrt |
我个人习惯用 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
tar -xJf gcc-linaro-*.tar.xz
sudo mv gcc-linaro-* /opt/toolchains/
export PATH=$PATH:/opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
验证是否装好:
arm-linux-gnueabihf-gcc --version
# 如果输出版本号,说明成了
小技巧:把 export PATH=... 写到 ~/.bashrc 里,省得每次开终端都要重新设。我吃过这个亏,编译到一半发现找不到工具链,气得想砸键盘。
2.3 首次编译体验
环境搭好了,咱们来编译一把试试。
BusyBox的编译分三步:配置、编译、安装。跟Linux内核很像,你想想看,它本身就是个迷你内核。
2.3.1 配置(make menuconfig)
执行:
make menuconfig
你会看到一个蓝底白字的配置界面。这里要改几个关键项:
- Cross Compiler prefix:填
arm-linux-gnueabihf- - Path to sysroot:如果你的工具链有sysroot,填上路径
- Build static binary (no shared libs):建议选上,省去动态库依赖的麻烦
怎么改?进入 Settings → Build Options,找到对应项,回车修改。
我的经验:第一次编译,别贪多。只选最基本的工具——ls、cat、echo、sh、init 这几个就够了。后面再慢慢加。选太多,编译慢,而且容易出依赖冲突。
2.3.2 编译(make)
配置完保存退出,然后:
make -j4
-j4 表示用4个线程并行编译。你机器核多可以调大,比如 -j8。
编译过程会输出一堆信息。如果一切顺利,最后你会看到:
LINK busybox
这就说明编译成功了。生成的可执行文件就叫 busybox,你 ls -lh 看看它多大——一般几百KB,比完整的Linux工具集小两个数量级。
如果报错:别慌。90%的情况是工具链路径没配对,或者缺少某个库。我曾经遇到一次,折腾了两小时,最后发现是 export PATH 写错了目录名。嗯,细心点。
2.3.3 安装(make install)
编译完要安装到目标目录:
make install CONFIG_PREFIX=./_install
这个命令会把所有选中的工具以软链接形式放到 _install/ 目录下。进去看看:
cd _install
ls -l bin/
# 你会看到 ls -> ../bin/busybox
# cat -> ../bin/busybox
# ... 等等
每个工具都是一个指向 busybox 的软链接。这就是BusyBox的精髓——一个二进制文件,扮演所有角色。
2.4 本章知识体系
为了让你更直观地理解整个流程,我画了张图:
2.5 避坑指南
最后,分享几个我踩过的坑:
- 工具链版本不匹配:比如用gcc 9编译,但板子上的glibc是2.19,可能跑不起来。建议用Linaro的长期支持版。
- 静态编译 vs 动态编译:静态编译出来的二进制大一点,但省心。动态编译需要板子上有对应的.so库,少一个就报错。我建议新手先用静态编译。
- 忘记 export PATH:这是最常见的错误。每次开新终端都要重新export,或者写到.bashrc里。
- make menuconfig 里没改前缀:默认是
gcc,编译出来是x86的,放到ARM板上直接Segmentation fault。
我的习惯:每次编译前,先执行 echo $CC 看看交叉编译器是不是对的。养成这个习惯,能省一半的调试时间。
好了,环境搭好了,编译也跑通了。你现在手里应该有一个 busybox 可执行文件和一堆软链接。这就是你嵌入式系统的「瑞士军刀」——虽然小,但能干活。