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 本章知识体系
下面这张图,把本章的核心流程串起来了。你可以把它当作一个检查清单。
这张图把流程分成了五个关键步骤:配置源 → 更新列表 → 安装包 → 升级系统 → 验证。每一步都有对应的命令,照着做就行。
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,把每一步执行的命令和输出都记下来。万一出问题,翻日志比重新猜快得多。
好了,基础依赖就绪。接下来,我们就可以正式开始折腾交叉编译工具链了。