2. 开发环境搭建:Ubuntu主机环境配置、交叉编译工具链安装、QEMU源码编译与安装

做嵌入式开发,环境搭建是第一步,也是最容易踩坑的一步。我记得刚入行那会儿,光配环境就折腾了两天,最后发现是源的问题。这一章,咱们就把 Ubuntu 主机、交叉编译工具链和 QEMU 仿真器这三样东西一次性搞定。

说白了,这套环境就是你的「武器库」。后面所有的工作——移植内核、调试驱动、跑应用——都得靠它。所以别急,一步步来。

本章目标: 在 Ubuntu 22.04 LTS 上搭建一套完整的 ARM 嵌入式 Linux 开发环境,包含交叉编译工具链和 QEMU 仿真器。
开发环境搭建知识体系 Ubuntu 22.04 LTS 主机 交叉编译工具链 QEMU 仿真器 aarch64-linux-gnu-gcc arm-linux-gnueabihf-gcc qemu-system-aarch64 qemu-system-arm 💡 核心思路:主机编译 → 交叉工具链生成 ARM 二进制 → QEMU 运行验证 无需真实硬件,即可完成嵌入式 Linux 全流程开发

2.1 Ubuntu 主机环境配置

我个人的习惯是用 Ubuntu 22.04 LTS,长期支持版,稳定。如果你用其他版本,问题也不大,但包名可能略有差异。

首先,更新软件源。这一步别偷懒,很多坑都是因为源太旧导致的。

sudo apt update
sudo apt upgrade -y

然后安装基础开发工具。这些是编译器和构建工具的前置依赖。

sudo apt install -y build-essential git vim curl wget \
    libncurses5-dev libssl-dev flex bison \
    python3 python3-pip python3-venv \
    device-tree-compiler u-boot-tools
我的经验: 如果你做 ARM64 开发,libncurses5-dev 和 libssl-dev 是内核配置和编译的必需品。缺了它们,make menuconfig 会报错。

接下来,安装一些 QEMU 编译需要的额外依赖。

sudo apt install -y ninja-build libglib2.0-dev \
    libpixman-1-dev libslirp-dev

嗯,这里要注意:libslirp-dev 是网络后端支持,如果你后面要做 QEMU 的网络仿真,这个必须装。

2.2 交叉编译工具链安装

交叉编译工具链,说白了就是「在 x86 电脑上编译出 ARM 能跑的程序」。你想想看,QEMU 仿真的是 ARM 板子,但你的 Ubuntu 是 x86 架构,没有交叉工具链,编译出来的东西 ARM 根本认不了。

我推荐两种方式,你选一种就行。

方式一:apt 直接安装(推荐新手)

最简单,包管理器搞定。

# ARM64 (AArch64)
sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# ARM32 (ARMv7 hard float)
sudo apt install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf

安装完后,验证一下:

aarch64-linux-gnu-gcc --version
arm-linux-gnueabihf-gcc --version

看到版本号就对了。

方式二:Linaro 工具链(推荐生产环境)

我在项目中遇到过,apt 版本有时候比较旧,或者你需要特定版本。这时候我会去 Linaro 官网下载。

# 下载 ARM64 工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

# 解压到 /opt
sudo tar -xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/

# 添加环境变量
echo 'export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin' >> ~/.bashrc
source ~/.bashrc
避坑指南: 我曾经因为 PATH 没配好,编译内核时报错「找不到交叉编译器」。检查方法很简单:which aarch64-linux-gnu-gcc,如果没输出路径,就是 PATH 没生效。

2.3 QEMU 源码编译与安装

为什么不用 apt 直接装 QEMU?说实话,apt 版本通常比较旧,而且缺少一些嵌入式开发需要的板级支持。我建议自己编译,灵活度高。

2.3.1 下载 QEMU 源码

git clone https://gitlab.com/qemu-project/qemu.git
cd qemu
git checkout v8.2.0  # 选一个稳定版本

我个人习惯用 v8.2.0,这个版本对 ARM 的支持比较完善。

2.3.2 配置编译选项

QEMU 支持很多目标架构,我们只编译 ARM 相关的,节省时间。

mkdir build && cd build
../configure \
    --target-list=aarch64-softmmu,arm-softmmu \
    --enable-slirp \
    --enable-kvm \
    --enable-debug \
    --prefix=/opt/qemu-8.2.0

解释一下这几个选项:

选项 说明
--target-list 只编译 ARM64 和 ARM32 的系统仿真模式
--enable-slirp 启用用户态网络栈,QEMU 虚拟机可以上网
--enable-kvm 启用 KVM 加速(虽然 ARM 仿真用不上,但留着没坏处)
--enable-debug 保留调试符号,后面调试内核时有用
--prefix 安装路径,我习惯放到 /opt 下统一管理

2.3.3 编译与安装

make -j$(nproc)
sudo make install

-j$(nproc) 用满所有 CPU 核心,编译会快很多。我第一次编译时没加这个参数,等了快半小时……

安装完成后,验证一下:

/opt/qemu-8.2.0/bin/qemu-system-aarch64 --version
/opt/qemu-8.2.0/bin/qemu-system-arm --version
小技巧: 把 QEMU 的 bin 目录加到 PATH 里,后面用起来方便。
echo 'export PATH=$PATH:/opt/qemu-8.2.0/bin' >> ~/.bashrc

2.4 环境验证

环境搭好了,咱们跑个简单的测试,确保所有工具都能正常工作。

写一个 Hello World 程序,用交叉编译器编译,再用 QEMU 运行。

# 创建测试文件
cat > hello.c << 'EOF'
#include <stdio.h>

int main() {
    printf("Hello from ARM64 QEMU!\n");
    return 0;
}
EOF

# 交叉编译
aarch64-linux-gnu-gcc -static -o hello hello.c

# 检查文件类型
file hello
# 输出: hello: ELF 64-bit LSB executable, ARM aarch64, ...

然后用 QEMU 运行这个 ARM64 程序:

/opt/qemu-8.2.0/bin/qemu-aarch64 ./hello

如果看到 Hello from ARM64 QEMU!,恭喜你,环境搭建成功!

验证清单:
  • ✅ Ubuntu 基础开发工具安装完成
  • ✅ 交叉编译工具链可用(aarch64 / arm)
  • ✅ QEMU 源码编译安装完成
  • ✅ 交叉编译 + QEMU 运行验证通过