2. 开发环境搭建:Ubuntu虚拟机、交叉编译工具链与必要开发包
做嵌入式Linux开发,第一步就是把环境搭好。这一步要是没弄利索,后面所有编译、裁剪、调试都会出幺蛾子。我见过太多新手把时间浪费在环境问题上,说白了,工具链不对,后面全是白干。
这一章,咱们就把开发环境彻底搞定。我会带着你从零开始,装好Ubuntu虚拟机、配好ARM交叉编译工具链、再把内核编译需要的几个关键开发包装上。嗯,跟着我的节奏来,一次搞定,后面就省心了。
2.1 为什么选择Ubuntu虚拟机?
你可能想问:为什么非要用虚拟机?直接在Windows上装个IDE不行吗?
我的经验是:嵌入式Linux开发,最好在Linux环境下做。Windows下的交叉编译环境虽然也能凑合,但坑太多——路径分隔符、换行符、权限模型,随便一个就能让你折腾半天。而Ubuntu是Linux发行版里对开发者最友好的,软件源丰富,社区活跃,遇到问题一搜就有答案。
我个人习惯用虚拟机而不是双系统。原因很简单:虚拟机快照功能太香了。搞内核裁剪时,万一系统搞崩了,一个快照就恢复回来,不用重装。我当年刚开始学的时候,就因为配环境把宿主机搞崩过两次……从那以后,虚拟机就成了我的标配。
2.2 安装Ubuntu虚拟机
这里我用VMware Workstation做演示,VirtualBox流程也差不多。咱们直接上步骤:
- 下载Ubuntu镜像:推荐Ubuntu 22.04 LTS,稳定,软件源支持到2027年。
- 创建虚拟机:选择"典型"安装,稍后安装操作系统,选Linux→Ubuntu 64位。
- 配置硬件:内存4096MB,处理器2核,网络选NAT模式(方便上网)。
- 挂载ISO启动:启动虚拟机,选择"Install Ubuntu",按向导走完。
- 安装后更新:进系统后先跑一遍更新。
# 进入系统后,先更新软件源和系统
sudo apt update
sudo apt upgrade -y
这一步没什么技术含量,但有个细节要注意:安装时选"最小安装",别装一堆用不上的办公软件和游戏。咱们这是开发机,不是娱乐机。
2.3 配置ARM交叉编译工具链
交叉编译,说白了就是在x86的电脑上编译出能在ARM芯片上跑的程序。为什么不能直接在ARM板上编译?因为ARM板性能太弱了,编译一个内核可能要几个小时,而在PC上只要十几分钟。
ARM GCC工具链有很多种,我推荐用gcc-arm-linux-gnueabihf。这个版本支持硬浮点,性能好,而且Ubuntu源里直接有,安装方便。
# 安装ARM交叉编译工具链
sudo apt install gcc-arm-linux-gnueabihf
# 验证安装
arm-linux-gnueabihf-gcc --version
安装完成后,你可以写个简单的测试程序验证一下:
# 写一个hello.c
echo '#include <stdio.h>
int main() {
printf("Hello, ARM!\n");
return 0;
}' > hello.c
# 用交叉编译器编译
arm-linux-gnueabihf-gcc -o hello hello.c
# 查看生成的文件类型
file hello
如果输出显示"ELF 32-bit LSB executable, ARM",说明工具链工作正常。嗯,这一步验证很重要,我见过有人装了半天,结果发现装的是x86的gcc,编译出来的东西根本不能在ARM上跑。
2.4 安装必要的开发包
编译Linux内核需要几个关键开发包。少了任何一个,编译时都会报错。我列个清单:
| 包名 | 作用 | 安装命令 |
|---|---|---|
| ncurses-dev | 提供make menuconfig的文本界面 | sudo apt install libncurses-dev |
| flex | 词法分析器,内核配置脚本需要 | sudo apt install flex |
| bison | 语法分析器,与flex配合使用 | sudo apt install bison |
| libssl-dev | 内核模块签名需要OpenSSL库 | sudo apt install libssl-dev |
安装命令可以一次性搞定:
sudo apt install libncurses-dev flex bison libssl-dev -y
这四个包,缺一不可。我当年第一次编译内核时,就漏装了libssl-dev,结果编译到一半报错"Cannot use CONFIG_CC_STACKPROTECTOR_STRONG",折腾了半天才发现是少了这个包。你想想看,编译一个内核要十几分钟,到快结束时才报错,那种感觉……嗯,你懂的。
sudo apt install build-essential git
2.5 环境验证:一个完整的测试流程
装完所有东西后,我建议你跑一遍完整的测试流程,确保环境没问题。这样后面做内核裁剪时,就不会被环境问题干扰。
# 1. 下载内核源码(以5.10 LTS为例)
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.100.tar.xz
tar -xf linux-5.10.100.tar.xz
cd linux-5.10.100
# 2. 配置内核(使用默认配置)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
# 3. 测试编译(只编译内核,不编译模块)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 zImage
如果编译成功,会在arch/arm/boot/目录下生成zImage文件。看到这个文件,就说明你的开发环境完全OK了。
2.6 本章知识体系
下面这张图,把本章的核心知识点串起来了。你可以对照着检查自己有没有遗漏:
这张图把整个流程串起来了:从虚拟机开始,装上工具链和开发包,最后用编译zImage来验证。每一步都有坑,但只要你按部就班来,就不会出大问题。
2.7 常见问题与解决
最后,我把自己这些年遇到过的常见问题整理一下,你遇到了可以直接查:
- 问题: 编译时报错"arm-linux-gnueabihf-gcc: command not found"
解决: 工具链没装或没加到PATH。检查dpkg -l | grep gcc-arm,确认已安装。 - 问题: 编译时报错"fatal error: curses.h: No such file or directory"
解决: 没装libncurses-dev。装上就行。 - 问题: 编译时报错"openssl/ssl.h: No such file or directory"
解决: 没装libssl-dev。装上就行。 - 问题: 虚拟机运行卡顿
解决: 检查虚拟机内存和CPU分配是否足够,或者关闭Windows的Hyper-V。