2. 搭建交叉编译环境(上):安装Linux虚拟机(Ubuntu 22.04)与基础开发工具
说实话,很多做嵌入式开发的朋友,一开始就被环境搭建给劝退了。我见过太多人,拿着Windows电脑,装个IDE就开始写ARM代码,结果编译出来的二进制文件在板子上跑不起来——说白了,你用的编译器是x86架构的,怎么可能生成ARM能识别的机器码?
这一章,我们就来解决这个最基础的问题。我会带你从零开始,在Windows或macOS上搭建一个Ubuntu 22.04的虚拟机,然后装好必备的开发工具。整个过程我踩过的坑,都会一一告诉你。
2.1 为什么非要用Linux虚拟机?
你可能想问:我直接在Windows上装个交叉编译器不行吗?嗯,理论上可以,但实际项目里你会遇到一堆麻烦。比如路径分隔符不一样、动态链接库找不到、Makefile里一堆兼容性判断……我早期一个项目,就因为Windows和Linux的换行符差异,折腾了整整两天。
用虚拟机的好处很明显:
- 环境隔离 —— 搞坏了直接删掉重来,不影响宿主机
- 与服务器一致 —— 你本地开发环境跟CI/CD服务器、同事的环境完全一致
- 快照功能 —— 装好基础环境后打个快照,后面随便折腾
2.2 选择虚拟机软件
我个人习惯用 VMware Workstation Player(免费版)或者 VirtualBox(开源免费)。两者我都用过很久,简单对比一下:
| 特性 | VMware Workstation Player | VirtualBox |
|---|---|---|
| 价格 | 个人免费 | 完全免费 |
| 性能 | 较好,3D加速支持好 | 一般,但够用 |
| 快照 | 支持 | 支持 |
| 共享文件夹 | 稳定 | 偶尔需要额外配置 |
| USB设备透传 | 稳定 | 支持,但有时需要装扩展包 |
如果你只是做嵌入式开发,两个都够用。我这次用 VMware Workstation Player 17 做演示,因为它的共享文件夹功能更稳定,后面我们传交叉编译工具链时会方便很多。
2.3 下载Ubuntu 22.04 LTS镜像
Ubuntu 22.04 LTS(Jammy Jellyfish)是目前最稳定的长期支持版本,支持到2027年。我们的交叉编译工具链、MQTT库都在这个版本上测试过。
下载地址:https://releases.ubuntu.com/22.04/
选 ubuntu-22.04.3-desktop-amd64.iso 这个文件。别下错了,要桌面版,服务器版没有图形界面,新手操作起来不方便。
2.4 创建虚拟机(一步步来)
嗯,这里我详细说一下步骤,每一步都有原因。
- 打开VMware Player,点击"创建新虚拟机"
- 选择"安装程序光盘映像文件(iso)",浏览到你刚才下载的Ubuntu 22.04 ISO文件
- 客户机操作系统选择"Linux",版本选"Ubuntu 64位"
- 虚拟机名称:我习惯写"Ubuntu 22.04 - Embedded Dev"
- 磁盘容量:建议至少 40GB。别觉得大,后面装交叉编译工具链、SDK、源码,20GB很快就用完了。我建议选"将虚拟磁盘存储为单个文件",性能更好。
- 自定义硬件:
- 内存:至少4GB,推荐8GB。编译大型项目时内存不够会卡死。
- 处理器:至少2核,推荐4核。交叉编译很吃CPU。
- 网络适配器:选NAT模式,这样虚拟机可以通过宿主机上网,同时宿主机也能访问虚拟机。
- USB控制器:选USB 3.0,后面接开发板时需要。
2.5 安装Ubuntu 22.04
启动虚拟机后,你会看到Ubuntu的安装界面。这里有几个关键点:
- 语言:选English(US)。虽然中文界面看着亲切,但终端里的错误信息、日志都是英文的,用英文系统能减少很多编码问题。
- 键盘布局:选English (US)。如果你用其他布局,后面敲命令时会很痛苦。
- 安装类型:选"Erase disk and install Ubuntu"。这是虚拟机,不用担心数据丢失。
- 用户名和密码:我建议用户名用全小写字母,比如
embed或dev。密码别太复杂,但也不能太简单,毕竟后面要装SSH服务。
安装过程大概10-15分钟,取决于你的电脑性能。趁这个时间,你可以去泡杯咖啡。
2.6 安装后的第一件事:更新系统
装好系统后,第一件事就是更新软件源和系统。打开终端(快捷键 Ctrl+Alt+T),执行:
sudo apt update
sudo apt upgrade -y
这个过程会更新所有已安装的软件包到最新版本。为什么要做这一步?因为Ubuntu ISO镜像里的软件包可能已经发布了好几个月,里面可能有安全漏洞或者bug。我在项目中就遇到过因为没更新系统,导致某个库版本太旧,编译时死活报错的情况。
2.7 安装基础开发工具
现在开始装我们真正需要的东西。这些工具是嵌入式开发的"标配":
sudo apt install -y build-essential git vim curl wget net-tools openssh-server
我来解释一下每个工具是干什么的:
| 工具 | 作用 | 为什么需要 |
|---|---|---|
build-essential |
包含gcc、g++、make等编译工具 | 编译C/C++代码的基础,没有它什么都干不了 |
git |
版本控制工具 | 下载开源代码(如MQTT库)、管理自己的项目 |
vim |
文本编辑器 | 修改配置文件、写代码(虽然我更喜欢VS Code,但服务器上vim是必备) |
curl / wget |
网络下载工具 | 下载交叉编译工具链、SDK等 |
net-tools |
网络诊断工具(ifconfig等) | 查看IP地址、调试网络连接 |
openssh-server |
SSH服务 | 远程登录虚拟机、用VS Code Remote开发 |
tree(查看目录结构)、htop(系统监控)、screen(终端复用器)。这些不是必须的,但能极大提升效率。
2.8 配置SSH服务(方便远程开发)
我个人习惯用VS Code的Remote-SSH插件来开发,这样可以在Windows上写代码,在Linux虚拟机上编译。要这么做,需要先配置好SSH。
安装完openssh-server后,检查一下服务状态:
sudo systemctl status ssh
如果没启动,手动启动:
sudo systemctl start ssh
sudo systemctl enable ssh # 设置开机自启
然后查看虚拟机的IP地址:
ip addr show
找到 ens33 或 eth0 下面的 inet 地址,一般是 192.168.x.x 这样的。记下这个IP,后面要用。
2.9 配置共享文件夹(宿主机与虚拟机传文件)
交叉编译工具链通常有几百MB,通过U盘拷贝太麻烦。用共享文件夹最方便。
在VMware里:
- 虚拟机 -> 设置 -> 选项 -> 共享文件夹
- 选择"总是启用"
- 添加一个共享文件夹,比如Windows上的
D:\share - 在虚拟机里,共享文件夹会挂载到
/mnt/hgfs/share
如果挂载不上,可能需要安装VMware Tools:
sudo apt install -y open-vm-tools open-vm-tools-desktop
装完后重启虚拟机,共享文件夹就能用了。
2.10 验证环境
装完这么多东西,我们来验证一下环境是否正常:
gcc --version
git --version
vim --version
ssh -V
如果每个命令都能正常输出版本信息,恭喜你,环境搭建成功了!
下面这张图总结了本章搭建的整个环境结构:
2.11 避坑指南
最后,分享几个我实际项目中遇到的坑:
- 虚拟机磁盘空间不足:我建议一开始就分配50GB以上。如果后面发现不够,VMware支持扩展磁盘,但操作起来比较麻烦,需要新建分区、挂载,不如一开始就给够。
- 共享文件夹权限问题:有时候共享文件夹里的文件权限是
755,但交叉编译时需要可执行权限。可以用sudo chmod +x 文件名解决。 - SSH连接被拒绝:检查一下防火墙
sudo ufw status,如果开启了,用sudo ufw allow ssh放行22端口。 - apt update速度慢:换成国内镜像源,比如清华源或阿里源。修改
/etc/apt/sources.list,把archive.ubuntu.com替换成mirrors.tuna.tsinghua.edu.cn。