2. 开发环境搭建:Ubuntu主机环境配置、交叉编译工具链安装、QEMU源码编译与安装
做嵌入式开发,环境搭建是第一步,也是最容易踩坑的一步。我记得刚入行那会儿,光配环境就折腾了两天,最后发现是源的问题。这一章,咱们就把 Ubuntu 主机、交叉编译工具链和 QEMU 仿真器这三样东西一次性搞定。
说白了,这套环境就是你的「武器库」。后面所有的工作——移植内核、调试驱动、跑应用——都得靠它。所以别急,一步步来。
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
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
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
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 运行验证通过