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以上 工具链+源码+中间文件,空间消耗很快
网络模式 桥接模式 方便与宿主机通信,也方便下载包
注意:磁盘建议用动态分配,别一开始就固定大小。我曾经因为固定分配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 知识体系图

下面这张图帮你理清整个环境准备的逻辑:

交叉编译环境依赖配置流程 宿主机系统 Windows / macOS / Linux 虚拟机 VMware / VirtualBox Ubuntu LTS 20.04 / 22.04 基础开发包 build-essential + git + vim + curl + ... 交叉编译工具链 gcc-arm-linux-gnueabihf / aarch64-linux-gnu-gcc 环境变量配置 (PATH / CROSS_COMPILE / ARCH)

这张图把整个流程串起来了。从宿主机到虚拟机,再到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编译一下。不是为了测试,而是给自己一个「嗯,搞定了」的心理暗示。做嵌入式开发,这种小仪式感挺重要的。

好了,环境准备就到这里。记住,基础打牢了,后面编译内核、移植驱动才会顺风顺水。别嫌麻烦,这一步值得花时间。

可可精品资料库