2. 搭建交叉编译环境(上):安装Linux虚拟机(Ubuntu 22.04)与基础开发工具

说实话,很多做嵌入式开发的朋友,一开始就被环境搭建给劝退了。我见过太多人,拿着Windows电脑,装个IDE就开始写ARM代码,结果编译出来的二进制文件在板子上跑不起来——说白了,你用的编译器是x86架构的,怎么可能生成ARM能识别的机器码?

这一章,我们就来解决这个最基础的问题。我会带你从零开始,在Windows或macOS上搭建一个Ubuntu 22.04的虚拟机,然后装好必备的开发工具。整个过程我踩过的坑,都会一一告诉你。

本章核心目标: 获得一个可用的Linux开发环境,为后续安装交叉编译工具链和编译MQTT客户端做好准备。

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 这个文件。别下错了,要桌面版,服务器版没有图形界面,新手操作起来不方便。

小技巧: 下载时可以用迅雷或IDM这类多线程工具,速度会快很多。Ubuntu官方服务器在国外,直接浏览器下载可能比较慢。

2.4 创建虚拟机(一步步来)

嗯,这里我详细说一下步骤,每一步都有原因。

  1. 打开VMware Player,点击"创建新虚拟机"
  2. 选择"安装程序光盘映像文件(iso)",浏览到你刚才下载的Ubuntu 22.04 ISO文件
  3. 客户机操作系统选择"Linux",版本选"Ubuntu 64位"
  4. 虚拟机名称:我习惯写"Ubuntu 22.04 - Embedded Dev"
  5. 磁盘容量:建议至少 40GB。别觉得大,后面装交叉编译工具链、SDK、源码,20GB很快就用完了。我建议选"将虚拟磁盘存储为单个文件",性能更好。
  6. 自定义硬件:
    • 内存:至少4GB,推荐8GB。编译大型项目时内存不够会卡死。
    • 处理器:至少2核,推荐4核。交叉编译很吃CPU。
    • 网络适配器:选NAT模式,这样虚拟机可以通过宿主机上网,同时宿主机也能访问虚拟机。
    • USB控制器:选USB 3.0,后面接开发板时需要。
注意: 如果你用的是VirtualBox,记得在"设置" -> "系统" -> "处理器"里开启"启用PAE/NX"和"启用VT-x/AMD-V"。VMware一般会自动开启。不开启的话,64位系统可能装不上。

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,后面要用。

踩坑提醒: 我曾经遇到过虚拟机IP地址每次重启都变化的情况,非常烦人。建议在VMware里设置"编辑" -> "虚拟网络编辑器",把NAT模式的DHCP设置改成静态IP分配,或者直接在Ubuntu里配置静态IP。后面章节我会专门讲网络配置。

2.9 配置共享文件夹(宿主机与虚拟机传文件)

交叉编译工具链通常有几百MB,通过U盘拷贝太麻烦。用共享文件夹最方便。

在VMware里:

  1. 虚拟机 -> 设置 -> 选项 -> 共享文件夹
  2. 选择"总是启用"
  3. 添加一个共享文件夹,比如Windows上的 D:\share
  4. 在虚拟机里,共享文件夹会挂载到 /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

如果每个命令都能正常输出版本信息,恭喜你,环境搭建成功了!

下面这张图总结了本章搭建的整个环境结构:

交叉编译开发环境结构图 交叉编译开发环境结构 宿主机(Windows / macOS) 虚拟机:Ubuntu 22.04 LTS 基础开发工具:build-essential, git, vim, curl, SSH 后续章节:交叉编译工具链 → MQTT库 → OTA升级 共享文件夹 / SSH 连接 实现宿主机 ↔ 虚拟机 文件与代码传输

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。