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
我的小习惯:装完系统第一件事就是配好 vim 和 tmux。裁剪过程中要反复编辑配置文件、切终端窗口,这两个工具能让你效率翻倍。

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
我曾经踩过的坑:工具链版本必须与内核版本匹配。有次我用 gcc 9 编译 Linux 5.10 内核,结果链接阶段报了一堆莫名其妙的错误。后来换成 gcc 10 就一切正常。所以,先查内核文档推荐的工具链版本,再动手。

验证安装是否成功:

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,改起来简直要命。

实战经验:裁剪 Linux 内核时,你几乎天天跟 Make 打交道。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 本章知识体系

下面这张图帮你理清本章的核心脉络:

构建环境准备知识体系 构建环境准备 Linux 开发环境 交叉编译工具链 基础构建工具 Ubuntu 20.04 LTS 安装 基础软件包安装 网络与磁盘配置 Linaro 预编译工具链 Buildroot 自动构建 crosstool-NG 手动定制 Make:内核/bootloader CMake:应用层/第三方库 Meson:新项目首选 核心原则:工具链版本必须与内核版本匹配

环境准备这一步,说白了就是打好地基。地基不稳,后面盖的楼再漂亮也得塌。我见过太多人跳过这一步直接开始裁剪,结果编译报错时连是工具链问题还是代码问题都分不清。