3. 安装基础依赖:Ubuntu/Debian 系统下安装必要软件包、配置网络源、更新系统

搭建交叉编译环境,说白了就是给宿主机(咱们的 PC)装上能生成目标板(比如 ARM 开发板)可执行代码的工具链。但在这之前,有一件事必须做扎实——把系统的基础依赖搞定。

我刚开始带团队的时候,有个同事折腾了两天,工具链就是编译不过。最后发现,居然是系统里缺了 build-essential 这个最基本的包。嗯,这种坑,踩过一次就记住了。

3.1 为什么先搞基础依赖?

交叉编译工具链本身也是程序,它需要编译器、链接器、各种库来把自己编译出来。如果宿主机系统本身就不完整,那后面每一步都可能报错。

你想想看,一个连 gcc 都没有的系统,怎么可能编译出针对 ARM 的 arm-linux-gnueabihf-gcc?

核心原则:宿主机系统必须是一个完整的开发环境,而不是一个最小化安装的服务器。

3.2 配置网络源(软件源)

Ubuntu/Debian 的软件包都存放在远程仓库里。默认的源服务器在国外,下载速度可能很慢。我个人习惯,装完系统第一件事就是换成国内镜像源。

3.2.1 备份原始源列表

动手之前,先备份。这是好习惯。

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

3.2.2 修改源列表

用你喜欢的编辑器打开 /etc/apt/sources.list:

sudo vim /etc/apt/sources.list

把里面的内容替换成国内镜像源。以 Ubuntu 22.04 LTS (jammy) 为例,使用阿里云镜像:

deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse

小提示:如果你用的是 Debian,源格式略有不同。Debian 11 (bullseye) 的阿里云源示例:

deb http://mirrors.aliyun.com/debian/ bullseye main contrib non-free
deb http://mirrors.aliyun.com/debian/ bullseye-updates main contrib non-free
deb http://mirrors.aliyun.com/debian/ bullseye-backports main contrib non-free
deb http://mirrors.aliyun.com/debian-security bullseye-security main contrib non-free

3.2.3 更新软件包列表

源改好后,执行更新命令:

sudo apt update

这个命令会从新配置的源服务器拉取最新的软件包列表。如果看到一堆 Hit 和 Get,说明源配置成功了。

3.3 安装必要软件包

接下来,安装编译工具链所需的基础包。我列一个清单,这些是我在多个项目中验证过的“最小必要集合”。

软件包 作用 备注
build-essential 包含 gcc、g++、make 等核心编译工具 必装
gcc-multilib 支持在 64 位系统上编译 32 位程序 某些工具链需要
g++-multilib 同上,针对 C++ 可选但建议装
libc6-dev-i386 32 位 C 库开发文件 配合 multilib 使用
flex 词法分析器生成器 编译某些工具链时需要
bison 语法分析器生成器 同上
texinfo 生成文档的工具 编译 binutils 时需要
unzip 解压工具 处理源码包
wget 下载工具 下载源码
git 版本控制 拉取代码

安装命令很简单,一行搞定:

sudo apt install -y build-essential gcc-multilib g++-multilib libc6-dev-i386 flex bison texinfo unzip wget git

注意:如果你是在 Docker 容器或最小化系统里操作,可能还需要安装 locales 和 ca-certificates,否则 wget 或 git 可能会因为证书问题报错。

3.4 更新系统

软件包装完后,我建议顺手把系统更新到最新。这能避免很多因为系统库版本太旧导致的兼容性问题。

sudo apt upgrade -y
sudo apt dist-upgrade -y

dist-upgrade 会处理依赖关系的变化,有时候会升级内核。升级完后,最好重启一下:

sudo reboot

我曾经在一个 Ubuntu 18.04 系统上没做 dist-upgrade,结果编译 glibc 时死活过不去。折腾了半天,最后发现是系统里的 libc6 版本太老,跟工具链要求的版本对不上。嗯,从那以后,我每次搭建环境前都会先跑一遍 dist-upgrade。

3.5 验证基础环境

装完别急着走,先验证一下。跑几个简单的命令,确认工具链能正常工作。

gcc --version
g++ --version
make --version
ld --version

如果每个命令都能正常输出版本信息,说明基础环境已经就绪。

3.6 本章知识体系

下面这张图,把本章的核心流程串起来了。你可以把它当作一个检查清单。

基础依赖安装流程 开始搭建 配置网络源 apt update 安装基础包 apt upgrade 避坑提醒 • 先备份 sources.list • 选对 Ubuntu 版本代号 • 装完记得验证 gcc 版本 核心包清单 • build-essential • gcc-multilib • flex, bison, texinfo

这张图把流程分成了五个关键步骤:配置源 → 更新列表 → 安装包 → 升级系统 → 验证。每一步都有对应的命令,照着做就行。

3.7 常见问题与解决

  • apt update 报错 “Failed to fetch”:通常是源地址写错了,或者网络不通。检查一下 /etc/apt/sources.list 里的 URL 是否能 ping 通。
  • 安装包时提示 “unmet dependencies”:先跑 sudo apt --fix-broken install,修复依赖关系后再重试。
  • gcc 版本太旧:如果系统自带的 gcc 版本低于 7,建议先升级。交叉编译工具链通常需要较新的 gcc 来编译。

我的习惯:每次搭建新环境,我都会在 /root 下建一个 setup_log.txt,把每一步执行的命令和输出都记下来。万一出问题,翻日志比重新猜快得多。

好了,基础依赖就绪。接下来,我们就可以正式开始折腾交叉编译工具链了。