4、开发环境搭建:Ubuntu虚拟机安装、必要工具链安装与版本控制

好,咱们正式开始动手了。这一章我带你搭开发环境。说实话,做嵌入式Linux开发,环境搭不好,后面全是坑。我自己带过不少新人,十有八九的问题都出在环境上。所以这一章,咱们稳扎稳打,一步步来。

4.1 为什么选Ubuntu?

你可能要问,为什么非得用Linux?Windows不香吗?嗯,这个问题我当年也问过。说白了,嵌入式Linux的交叉编译工具链、内核源码、驱动模块,这些东西在Windows上折腾起来太痛苦了。我见过有人在Windows上装Cygwin硬搞,最后编译一个内核花了三天,还各种报错。

我个人习惯用Ubuntu 20.04 LTS。为什么?因为稳定。LTS版本有5年支持,社区资源也最丰富。你遇到问题,Google一搜,基本都有答案。Ubuntu 22.04 LTS也行,但有些老工具链的兼容性需要留意一下。

核心建议:新手别追新版本。Ubuntu 20.04 LTS,稳如老狗。

4.2 安装Ubuntu虚拟机

咱们用VMware Workstation或者VirtualBox都行。我个人偏向VMware,性能好一些。但VirtualBox免费,也够用。

步骤很简单,我快速过一遍:

  1. 下载Ubuntu 20.04 LTS的ISO镜像
  2. 新建虚拟机,分配4GB以上内存,2个以上CPU核心
  3. 硬盘给80GB(后面要编译内核和工具链,空间小了真不够)
  4. 安装时选「最小安装」,省得装一堆用不上的软件

小技巧:安装完成后,记得装VMware Tools或VirtualBox增强功能。不然屏幕分辨率调不了,复制粘贴也用不了,很痛苦。

装好之后,第一件事就是换源。国内网络环境你懂的,不换源,apt update能等到你怀疑人生。

# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 替换为清华源
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list

# 更新
sudo apt update && sudo apt upgrade -y

4.3 必要工具链安装

环境搭好了,接下来装工具。这些工具是嵌入式开发的「吃饭家伙」,缺一不可。

4.3.1 GCC:编译器

GCC是C语言的编译器。咱们后面编译内核、uboot、应用程序,全靠它。

sudo apt install build-essential
gcc --version  # 验证安装

build-essential这个包会帮你装好gcc、g++、make等基础工具。我建议你装完后跑一下gcc --version确认版本。我记得有一次帮同事排查问题,搞了半天发现他gcc没装全,编译报错一堆莫名其妙的东西。

4.3.2 GDB:调试器

写代码不出bug?不可能的。GDB就是你的「照妖镜」。

sudo apt install gdb
gdb --version

GDB的用法后面章节会细讲。这里先装好。我个人的经验是,调试嵌入式程序时,GDB配合core dump文件,定位段错误特别快。你想想看,程序崩了,直接看堆栈,比一行行加printf高效多了。

4.3.3 Make:构建工具

Make是Linux世界最经典的构建工具。虽然现在有CMake、Meson这些新工具,但Make依然是内核、uboot等项目的标配。

sudo apt install make
make --version

注意:Make的版本别太老。4.0以上基本够用。太老的版本对某些语法支持不好。

4.3.4 CMake:现代化构建工具

CMake是Make的上层封装。它不直接编译,而是生成Makefile。好处是跨平台,写一次CMakeLists.txt,Linux、Windows、macOS都能编译。

sudo apt install cmake
cmake --version

我建议你两个都学。Make要懂,因为很多老项目还在用。CMake也要会,因为新项目基本都用它了。

4.4 版本控制:Git

没有Git,代码管理就是灾难。我见过有人用「代码_最终版_真的最终版_不改了.zip」这种命名方式...嗯,你懂的。

4.4.1 安装Git

sudo apt install git
git --version

4.4.2 配置Git

装好后,先配一下用户信息。不然提交代码时会报错。

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global core.editor vim  # 我个人习惯用vim

4.4.3 基本操作

咱们这个课程的项目代码,我都会用Git管理。你跟着做就行:

# 克隆课程代码
git clone https://github.com/your-repo/5g-cpe-course.git

# 查看状态
git status

# 添加文件
git add filename.c

# 提交
git commit -m "添加了xxx功能"

# 推送到远程
git push origin main

核心习惯:每次修改代码前,先git pull拉取最新代码。改完后,及时git commit。别攒一堆再提交,容易乱。

4.5 代码管理规范

做项目,尤其是团队协作,代码管理必须有规范。我踩过太多坑了,总结几条经验:

规范项 说明 我的建议
分支策略 主分支(main)保持稳定,开发在dev分支 功能分支命名:feature/xxx
提交信息 写清楚改了啥,为什么改 别写「fix bug」,要写「修复了内存泄漏问题」
代码审查 合并前必须Review 至少两个人看过再合
标签管理 发布版本打Tag v1.0.0、v1.1.0 这样命名

我曾经在一个项目里,因为没规范,同事直接往main分支push了未测试的代码,结果整个编译都挂了。从那以后,我强制要求所有合并必须走Pull Request,再也没出过类似问题。

4.6 验证环境

工具都装好了,咱们写个简单的程序验证一下:

// hello.c
#include <stdio.h>

int main() {
    printf("Hello, 5G CPE!\n");
    return 0;
}
# 编译
gcc hello.c -o hello

# 运行
./hello

# 用GDB调试
gdb ./hello
(gdb) break main
(gdb) run
(gdb) next
(gdb) print "Hello, 5G CPE!"
(gdb) quit

如果能看到输出,说明环境没问题。嗯,到这里,你的开发环境就搭好了。

最后提醒:把虚拟机做个快照。万一后面搞坏了,一键恢复,省得重装。我每次搭完环境第一件事就是做快照,这习惯救过我很多次。

下一章,咱们开始接触真正的嵌入式Linux系统。我会带你从零编译一个最小系统,看看内核是怎么跑起来的。准备好了吗?