3、Linux环境准备:Ubuntu系统安装、虚拟机配置、基础开发包安装
做嵌入式交叉编译,说白了第一步就是搭环境。我见过太多新手卡在这一步——系统装好了,编译却报一堆错,最后发现是基础包没装全。嗯,咱们今天就把这事一次性说清楚。
3.1 为什么选Ubuntu?
我个人习惯用Ubuntu LTS版本。为什么?因为稳定。你想想看,交叉编译环境一旦配好,可能要用好几年。Ubuntu LTS有5年支持,社区资源也最丰富。我目前在用的是20.04 LTS,当然你用22.04甚至24.04也没问题。
其实选Ubuntu还有个原因:它的包管理机制最成熟。apt-get一条命令,依赖关系自动帮你搞定。我在项目中遇到过用其他发行版折腾半天装不上库的情况,换Ubuntu十分钟解决。
3.2 虚拟机配置要点
如果你在Windows或macOS上做开发,虚拟机是绕不开的。我建议用VMware Workstation或VirtualBox,两者我都用过,说下关键配置:
| 配置项 | 建议值 | 说明 |
|---|---|---|
| 内存 | 4GB以上 | 交叉编译很吃内存,尤其编译大型项目时 |
| CPU核心 | 2-4核 | 多核编译能大幅缩短时间 |
| 磁盘空间 | 40GB以上 | 工具链+源码+中间文件,空间消耗很快 |
| 网络模式 | 桥接模式 | 方便与宿主机通信,也方便下载包 |
3.3 基础开发包安装
系统装好后,第一件事就是装build-essential。这个包包含了gcc、g++、make等核心工具。命令很简单:
sudo apt update
sudo apt upgrade -y
sudo apt install build-essential -y
装完后验证一下:
gcc --version
g++ --version
make --version
看到版本号就说明装好了。嗯,这里要注意,apt update一定要先执行,否则可能装到旧版本。
3.4 其他必备工具包
除了build-essential,我建议再装这些:
- git:版本管理,交叉编译源码经常从GitHub拉
- vim/nano:文本编辑器,改配置文件用
- curl/wget:下载工具链和源码
- libncurses-dev:menuconfig配置界面依赖
- flex/bison:词法分析和语法分析工具
- texinfo:生成文档用
sudo apt install git vim curl wget libncurses-dev flex bison texinfo -y
3.5 交叉编译工具链安装
工具链有两种装法:apt直接装,或者手动编译。我建议新手先用apt:
# 以ARM为例
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
验证一下:
arm-linux-gnueabihf-gcc --version
看到版本号就对了。如果你需要其他架构,比如aarch64(ARM64)、mipsel等,把名字换一下就行。
3.6 环境变量配置
工具链装好后,最好把路径加到PATH里。编辑~/.bashrc:
export PATH=$PATH:/usr/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
然后source一下:
source ~/.bashrc
为什么要设CROSS_COMPILE?因为很多嵌入式项目的Makefile会读取这个变量。你不设的话,编译时还得手动指定,麻烦。
3.7 常见问题与避坑
问题1:apt安装时提示依赖缺失
执行 sudo apt --fix-broken install 修复依赖关系。
问题2:编译时报错"cannot find -lxxx"
说明缺某个库的开发版。用 apt search xxx 找到对应的-dev包装上。
我曾经踩过的坑:有一次装完工具链,编译时死活找不到头文件。查了半天,发现是32位兼容库没装。如果你在64位系统上编译32位程序,记得装:
sudo apt install lib32z1 lib32ncurses5 lib32bz2-1.0 -y
3.8 知识体系图
下面这张图帮你理清整个环境准备的逻辑:
这张图把整个流程串起来了。从宿主机到虚拟机,再到Ubuntu系统,然后装基础包、工具链,最后配环境变量。每一步都环环相扣,缺一不可。
3.9 验证环境是否就绪
最后,写个简单的测试程序验证一下:
# 创建一个测试文件
echo '#include <stdio.h>
int main() {
printf("Hello, Embedded World!\n");
return 0;
}' > test.c
# 用交叉编译器编译
arm-linux-gnueabihf-gcc test.c -o test
# 查看生成的文件类型
file test
如果输出显示是ARM架构的ELF文件,恭喜你,环境配好了!
我的习惯:每次配完环境,我都会写个简单的hello world编译一下。不是为了测试,而是给自己一个「嗯,搞定了」的心理暗示。做嵌入式开发,这种小仪式感挺重要的。
好了,环境准备就到这里。记住,基础打牢了,后面编译内核、移植驱动才会顺风顺水。别嫌麻烦,这一步值得花时间。