开发环境概览:Linux宿主机、目标硬件与工具链
做嵌入式开发,第一件事不是写代码,而是先把环境搭明白。我见过太多新手一上来就急着敲代码,结果编译报错半天找不到原因——最后发现是工具链版本不对。嗯,这节课我们就先把底子打好。
Linux宿主机环境准备
说白了,交叉编译离不开Linux。为什么?因为大多数嵌入式工具链都是基于Linux的,Windows上虽然也能搞,但坑太多。我个人习惯用Ubuntu LTS版本,稳定,社区活跃,遇到问题好搜。
基础软件包
一个干净的Ubuntu系统,需要装这些基础依赖:
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install git vim curl wget
sudo apt-get install libncurses5-dev
sudo apt-get install flex bison
sudo apt-get install texinfo help2man
磁盘与目录规划
交叉编译会产生大量中间文件。我建议单独划一个目录来放:
mkdir -p ~/embedded
mkdir -p ~/embedded/toolchain
mkdir -p ~/embedded/kernel
mkdir -p ~/embedded/rootfs
mkdir -p ~/embedded/apps
这样结构清晰,找东西快。我曾经在一个项目里把所有东西都扔在home下,三个月后自己都找不到编译产物在哪……
目标硬件平台:ARM Cortex-A系列
我们这门课的目标平台是ARM Cortex-A系列。为什么选它?因为它是目前嵌入式Linux领域最主流的架构。从智能家居网关到工业控制板,到处都有它的影子。
Cortex-A系列核心特性
| 特性 | 说明 |
|---|---|
| 架构 | ARMv7-A / ARMv8-A |
| 寻址 | 32位(ARMv7)或64位(ARMv8) |
| MMU | 支持,可运行Linux |
| 缓存 | L1/L2独立缓存 |
| 典型型号 | Cortex-A7, A8, A9, A53, A72 |
关键点:Cortex-A系列带MMU,这是它能跑Linux的前提。Cortex-M系列没有MMU,只能跑RTOS,别搞混了。
我选用的具体型号
课程中我以Cortex-A9为例。为什么?因为A9是ARMv7-A的经典代表,资料多,QEMU模拟也成熟。你学会了A9,换A53、A72只是改几个参数的事。
工具链选择
工具链是交叉编译的核心。说白了,它就是一套能在x86电脑上生成ARM代码的编译器、链接器、库的集合。
主流工具链对比
| 工具链 | 特点 | 适用场景 |
|---|---|---|
| GNU GCC | 开源、免费、最通用 | 绝大多数嵌入式Linux项目 |
| ARM GCC | ARM官方优化版 | 对性能有要求的场景 |
| Linaro GCC | 针对ARM优化,更新快 | ARMv7/v8开发首选 |
| Buildroot | 自动构建整套工具链+根文件系统 | 快速原型开发 |
| Yocto | 企业级,可定制性强 | 产品级项目 |
我个人推荐初学者用Linaro GCC。它预编译好,直接下载解压就能用,省去自己编译工具链的麻烦。我自己第一个项目就是被自己编译的工具链坑了三天——链接器版本不对,死活链接不上。
工具链命名规则
你下载工具链时会看到类似这样的名字:
arm-linux-gnueabihf-
arm-none-linux-gnueabi-
aarch64-linux-gnu-
拆开来看:
- arm:目标架构
- linux:目标操作系统
- gnueabi:使用GNU EABI接口
- hf:硬浮点(Hard Float)
知识体系总览
下面这张图把本章的核心逻辑串起来了。你跟着这个脉络走,就不会乱。
这张图把三个核心要素串起来了:宿主机提供编译环境,工具链负责代码转换,目标板是最终运行平台。三者缺一不可。
环境验证小实验
装完工具链后,怎么确认它能用?写个最简单的程序试试:
# 编写测试程序
echo '#include <stdio.h>
int main() {
printf("Hello ARM!\n");
return 0;
}' > hello.c
# 使用交叉编译器编译
arm-linux-gnueabihf-gcc hello.c -o hello_arm
# 查看生成的文件信息
file hello_arm
如果输出显示 ELF 32-bit LSB executable, ARM,说明工具链工作正常。我曾经见过有人编出来还是x86的——后来发现PATH里没配好,调用的还是本地gcc。
总结一下:环境准备就三件事——装好Linux系统、了解目标硬件、选对工具链。这三步走稳了,后面编译内核、移植驱动才有基础。