4、嵌入式交叉编译环境搭建:安装交叉编译工具链、配置环境变量、验证编译环境
好,咱们进入第四章。这一章要解决一个很实际的问题——交叉编译环境。
你想想看,我们平时在PC上写代码,编译器生成的是x86架构的机器码。但嵌入式设备呢?ARM、MIPS、RISC-V,架构五花八门。你总不能把PC上的二进制文件直接丢到开发板上跑吧?那肯定跑不起来。
所以,我们需要一套工具链,在PC上编译出目标设备能运行的代码。这就是交叉编译。
我个人习惯把交叉编译环境比作「翻译官」。你的代码是中文,目标设备只懂英文。交叉编译工具链,就是那个把中文翻译成英文的翻译官。没有它,寸步难行。
4.1 安装交叉编译工具链
安装方式有很多种。我建议你根据目标平台来选择。最常见的有两种:
- 从芯片厂商获取预编译工具链:比如ARM官方提供的
gcc-arm-none-eabi,或者树莓派用的arm-linux-gnueabihf。 - 使用包管理器安装:Ubuntu上直接
apt install,省心。
我在项目中遇到过好几次,新手喜欢自己从源码编译工具链。说实话,除非你有特殊需求,否则别这么干。编译一个完整的GCC工具链,耗时几个小时不说,中间各种依赖问题能让你崩溃。直接用现成的,不香吗?
这里以ARM Cortex-A系列为例,演示一下安装过程:
# 更新包列表
sudo apt update
# 安装ARM交叉编译工具链
sudo apt install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf
# 验证安装
arm-linux-gnueabihf-gcc --version
嗯,这里要注意。不同版本的Ubuntu,包名可能略有差异。如果你用的是Ubuntu 20.04以上,上面的命令应该没问题。如果是老版本,可能需要搜索一下apt-cache search arm。
4.2 配置环境变量
工具链装好了,但系统还不知道它在哪里。你需要告诉系统:嘿,我把编译器放在这个目录下了,你以后要用它。
配置环境变量,说白了就是设置PATH。我个人习惯把交叉编译器的路径加到~/.bashrc或~/.zshrc里。这样每次打开终端,环境自动生效。
# 编辑配置文件
vim ~/.bashrc
# 在文件末尾添加
export PATH=$PATH:/usr/bin/arm-linux-gnueabihf-
# 或者更精确一点,指定到bin目录
export CROSS_COMPILE=arm-linux-gnueabihf-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export LD=${CROSS_COMPILE}ld
# 保存退出后,使配置生效
source ~/.bashrc
为什么要定义CROSS_COMPILE这个变量?因为很多嵌入式项目的Makefile里,都会用这个变量来指定交叉编译器。你定义了它,后续编译内核、uboot、应用层代码时,直接make CROSS_COMPILE=arm-linux-gnueabihf-就行了。省事。
env.sh脚本,里面设置好对应的环境变量。编译前source env.sh,互不干扰。我曾经因为混用了不同版本的工具链,导致一个驱动模块死活加载不上,查了两天才发现是编译器版本不匹配。
4.3 验证编译环境
环境配好了,怎么知道它能不能用?写个最简单的Hello World试试。
// hello.c
#include <stdio.h>
int main() {
printf("Hello, Embedded World!\n");
return 0;
}
然后交叉编译它:
arm-linux-gnueabihf-gcc -o hello hello.c
编译完成后,用file命令看看生成的文件:
file hello
你应该会看到类似这样的输出:
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, not stripped
看到ARM字样了吗?这说明它确实是ARM架构的可执行文件。如果你在PC上直接运行它,会报错:cannot execute binary file: Exec format error。这就对了!因为你的PC是x86架构,跑不了ARM的二进制文件。
你可能会问:那怎么验证它能不能在开发板上跑?
嗯,最直接的办法,把文件传到开发板上,然后运行。但如果你手头没有开发板,也可以用qemu-arm模拟运行:
# 安装qemu用户态模拟器
sudo apt install qemu-user
# 模拟运行
qemu-arm ./hello
如果输出Hello, Embedded World!,恭喜你,交叉编译环境搭建成功!
- 交叉编译工具链必须与目标架构匹配
- 环境变量配置要持久化,建议写到
~/.bashrc - 用
file命令验证生成文件的架构 - 没有开发板时,可以用
qemu-arm做初步验证
好了,这一章的内容就到这里。交叉编译环境是嵌入式开发的基石。你想想看,后面所有的内核编译、驱动开发、应用部署,都离不开它。所以这一步一定要走稳。
下一章,我们会正式进入Jenkins的安装与配置。到时候,你会看到交叉编译环境如何与Jenkins流水线结合,实现真正的自动化构建。