第2章:编译环境搭建——交叉编译工具链的安装、环境变量配置、验证工具链是否可用
好,咱们正式开始动手了。
上一章我们聊了BusyBox是什么,它能干什么。但光说不练假把式,要真正把BusyBox用起来,第一步就是搭环境。说白了,你得先有一把趁手的“刀”——交叉编译工具链。
为什么叫“交叉”?因为你是在你的电脑(x86架构)上,编译出给ARM、MIPS或者其他嵌入式芯片用的程序。你的电脑是“宿主机”,目标板是“目标机”。这两者CPU指令集不同,所以需要一个特殊的编译器。
我个人习惯,先把工具链装好,再配置环境变量,最后做个快速验证。三步走,稳得很。
2.1 交叉编译工具链的安装
工具链的选择其实挺多的。常见的有Linaro提供的gcc-arm-linux-gnueabihf,或者ARM官方出的arm-none-linux-gnueabi。我项目中用得最多的是Linaro的版本,稳定,社区活跃,遇到问题也好搜。
第一步:下载
去Linaro官网或者ARM官网,找到对应你目标架构的版本。比如我目标板是ARM Cortex-A7,那就选arm-linux-gnueabihf。
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
第二步:解压
解压到某个目录,我一般放在/opt/toolchains/下面,方便管理。
sudo mkdir -p /opt/toolchains
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/toolchains/
第三步:确认目录结构
解压完后,进去看一眼。里面应该有bin、lib、arm-linux-gnueabihf等目录。bin目录下就是我们要用的编译器、链接器等工具。
ls /opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/
2.2 环境变量配置
工具链装好了,但系统还不知道它在哪。你得告诉系统:“嘿,编译器在这儿呢!”
配置环境变量,说白了就是把工具链的bin目录加到PATH里。这样你敲arm-linux-gnueabihf-gcc的时候,系统能找到它。
方法一:临时生效(当前终端)
export PATH=/opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
方法二:永久生效(推荐)
编辑你的shell配置文件,比如~/.bashrc或者~/.zshrc,在末尾加上一行:
echo 'export PATH=/opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
嗯,这里要注意:source一下,或者重新开一个终端,配置才会生效。
echo $PATH > ~/path_backup.txt
2.3 验证工具链是否可用
环境配好了,怎么知道能不能用?很简单,跑几个命令验证一下。
验证一:查看编译器版本
arm-linux-gnueabihf-gcc --version
如果看到类似下面的输出,说明工具链已经可以调用了:
arm-linux-gnueabihf-gcc (Linaro GCC 7.5.0-2019.12) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
验证二:编译一个简单的C程序
写一个hello.c:
#include <stdio.h>
int main() {
printf("Hello, BusyBox!\n");
return 0;
}
然后用交叉编译器编译:
arm-linux-gnueabihf-gcc -o hello hello.c
编译完成后,用file命令看看生成的文件:
file hello
你应该会看到类似这样的输出:
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, not stripped
看到“ARM”字样了吗?说明这确实是一个ARM架构的可执行文件。不是x86的。这就对了。
验证三:检查工具链中的其他工具
交叉工具链里不止有gcc,还有ar、ld、objcopy、strip等。你可以快速扫一眼:
ls /opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/ | head -20
2.4 本章知识体系
为了让你更直观地理解这一章的内容,我画了一张流程图。它展示了从下载工具链到最终验证通过的完整路径。
你看,整个流程其实不复杂。但每一步都有坑。比如下载的版本不对,解压路径有空格,环境变量没生效,等等。我刚开始做嵌入式的时候,光配环境就折腾了一下午。后来总结出经验:先验证,再往下走。每一步都确认没问题,后面就顺了。
好了,工具链已经就绪。接下来我们就可以用它来编译BusyBox了。你准备好了吗?