2、构建环境准备:Linux开发环境搭建、交叉编译工具链安装、基础构建工具(Make、CMake、Meson)介绍
系统裁剪这件事,说白了就是「把不需要的东西统统砍掉」。但动手砍之前,你得先把刀磨好。这一章我们就来搞定开发环境——Linux 系统、交叉编译工具链、还有那几个天天打交道的构建工具。
我个人习惯用 Ubuntu 20.04 LTS 作为宿主机。为什么选它?因为社区活跃,遇到问题随便一搜就有答案。你非要用 CentOS 或者 Arch 也行,但别在环境问题上卡太久——我见过太多人花三天装工具链,最后项目没时间做了。
2.1 Linux 开发环境搭建
先说说宿主机。你不需要一台性能怪兽,4 核 CPU、8GB 内存、50GB 空闲磁盘就够了。我当年用一台老旧的 ThinkPad T430 也撑过了整个项目。
几个关键点:
- 磁盘分区:建议给根目录留 30GB 以上,/home 留 20GB 以上。交叉编译产物很占空间,一个完整的 buildroot 构建能吃掉 10GB。
- 网络配置:确保能稳定访问 GitHub、kernel.org 这些站点。我在国内做项目时习惯配个代理,不然下载源码包能等到崩溃。
- 基础软件包:Ubuntu 下跑一行命令搞定——
sudo apt update
sudo apt install build-essential git wget curl \
libncurses-dev flex bison libssl-dev \
bc python3 python3-pip cpio unzip rsync
2.2 交叉编译工具链安装
交叉编译是什么?简单说,你在 x86 电脑上写代码,编译出 ARM 或 RISC-V 架构的可执行文件。这中间需要一个「翻译官」——交叉编译工具链。
安装方式有三种,我按推荐程度排个序:
| 方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Linaro 预编译工具链 | ARM 架构快速原型 | 即下即用,社区成熟 | 版本固定,定制性差 |
| Buildroot 自动构建 | 完整系统裁剪项目 | 工具链与系统匹配度高 | 首次构建耗时较长 |
| crosstool-NG 手动定制 | 特殊架构或深度定制 | 完全可控 | 配置复杂,学习曲线陡 |
我建议初学者直接用 Linaro 的预编译版本。以 ARM 64 位为例:
# 下载 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz
# 解压到 /opt 目录
sudo tar -xf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt
# 添加环境变量
export PATH=/opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin:$PATH
验证安装是否成功:
aarch64-none-linux-gnu-gcc --version
# 输出类似:aarch64-none-linux-gnu-gcc (GCC) 10.2.1 20201103
写个简单的 Hello World 测试一下:
# test.c
#include <stdio.h>
int main() {
printf("Hello from ARM64!\n");
return 0;
}
# 编译
aarch64-none-linux-gnu-gcc -o test test.c
# 查看文件信息
file test
# 输出:test: ELF 64-bit LSB executable, ARM aarch64, ...
看到「ARM aarch64」就对了。这说明你已经在 x86 机器上成功生成了 ARM 的可执行文件。
2.3 基础构建工具介绍
构建工具是系统裁剪的「脚手架」。我主要用三个:Make、CMake、Meson。它们各有各的脾气。
2.3.1 Make
Make 是最古老的构建工具,也是 Linux 内核和大部分开源项目的标配。它的核心是一个 Makefile 文件,里面写满了规则。
一个简单的 Makefile 长这样:
CC = aarch64-none-linux-gnu-gcc
CFLAGS = -O2 -Wall
all: hello
hello: hello.o
$(CC) -o $@ $^
hello.o: hello.c
$(CC) $(CFLAGS) -c $<
clean:
rm -f *.o hello
运行 make 就能编译,make clean 清理产物。简单直接,但大型项目里 Makefile 会变得非常复杂。我见过一个包含 2000 行的 Makefile,改起来简直要命。
make menuconfig 配置内核,make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- 编译内核。记住这个命令模板,后面章节会反复用到。
2.3.2 CMake
CMake 是 Make 的「升级版」。它不直接编译,而是先生成 Makefile 或 Ninja 构建文件。好处是跨平台、语法更友好。
一个 CMakeLists.txt 示例:
cmake_minimum_required(VERSION 3.10)
project(HelloWorld C)
set(CMAKE_C_COMPILER aarch64-none-linux-gnu-gcc)
set(CMAKE_C_FLAGS "-O2 -Wall")
add_executable(hello hello.c)
构建步骤:
mkdir build && cd build
cmake ..
make
CMake 在嵌入式项目里越来越流行。很多第三方库(比如 OpenCV、FFmpeg)都用 CMake 管理。我个人习惯用 CMake 管理自己的应用层代码,用 Make 管理内核和 bootloader。
2.3.3 Meson
Meson 是后起之秀,设计目标就是「快」和「易用」。它用 Python 写配置,用 Ninja 做后端构建。
一个 meson.build 文件:
project('hello', 'c',
default_options: ['c_std=c11'])
cc = meson.get_compiler('c')
executable('hello', 'hello.c',
c_args: ['-O2', '-Wall'])
构建命令:
meson setup build
cd build
ninja
Meson 的语法比 CMake 简洁很多,而且构建速度确实快。不过生态还不够成熟,很多老项目不支持。我一般在新的裁剪项目里用 Meson,老项目还是老老实实用 Make。
2.4 三种工具对比
| 特性 | Make | CMake | Meson |
|---|---|---|---|
| 学习曲线 | 中等 | 较陡 | 平缓 |
| 跨平台支持 | 差 | 好 | 好 |
| 构建速度 | 中等 | 中等 | 快 |
| 生态成熟度 | 极高 | 高 | 中等 |
| 嵌入式项目适用性 | 内核/bootloader | 应用层/第三方库 | 新项目首选 |
你想想看,这三种工具其实没有绝对的优劣。关键看项目需求。内核裁剪必须用 Make,应用层开发用 CMake 或 Meson 都行。我自己的做法是:内核用 Make,应用用 CMake,新项目尝试 Meson。
2.5 本章知识体系
下面这张图帮你理清本章的核心脉络:
环境准备这一步,说白了就是打好地基。地基不稳,后面盖的楼再漂亮也得塌。我见过太多人跳过这一步直接开始裁剪,结果编译报错时连是工具链问题还是代码问题都分不清。