3. 编译工具链:GCC交叉编译器、CMake、Make工具安装与配置
好,咱们接着往下走。上一章我们把Ubuntu系统跑起来了,也把PX4源码拉到了本地。但源码是源码,它只是一堆文本文件。要让这些文本变成能在飞控板上运行的二进制固件,中间还隔着一道关键的工序——编译。
说白了,编译就是把人类能读懂的C/C++代码,翻译成芯片能执行的机器指令。而完成这个翻译工作的,就是咱们这章要讲的编译工具链。
我个人习惯把工具链比作一个「翻译团队」:GCC是那个懂外语的翻译官,CMake是项目经理,Make则是那个拿着任务清单、指挥大家干活的工头。缺了谁,这活都干不利索。
核心逻辑: 在PC(x86架构)上编译出能在ARM架构的STM32芯片上运行的程序,这叫「交叉编译」。所以我们需要的是「交叉编译器」,而不是你电脑上自带的那个GCC。
3.1 安装GCC交叉编译器
这是最核心的一步。PX4官方推荐使用 arm-none-eabi-gcc 这个工具链。注意这个名字:arm(ARM架构)、none(无操作系统)、eabi(嵌入式应用二进制接口)。
我记得刚开始接触PX4时,直接用了Ubuntu软件源里的版本,结果编译到一半报了一堆莫名其妙的错误。后来才发现,版本不对!PX4对GCC版本有严格要求,不是随便装一个就能用的。
版本要求(以PX4 v1.14为例):
- 推荐版本:GCC 10.3.1 20210824 (Arm GNU Toolchain 10.3-2021.07)
- 最低版本:GCC 9.x 以上
- 不推荐:GCC 8.x 及以下(编译会报错)
安装方式有两种,我建议你用第二种——干净、可控、好卸载。
方式一:apt安装(不推荐)
sudo apt-get install gcc-arm-none-eabi
# 检查版本
arm-none-eabi-gcc --version
这种方式省事,但版本通常比较旧。我在项目中吃过这个亏,编译出来的固件在飞控上跑着跑着就死机了,查了两天才发现是编译器优化问题。
方式二:手动安装(推荐)
# 1. 下载官方工具链(以10.3-2021.07为例)
wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/10.3-2021.07/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2
# 2. 解压到指定目录
sudo mkdir -p /opt/gcc-arm-none-eabi
sudo tar xjf gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2 -C /opt/gcc-arm-none-eabi
# 3. 添加环境变量(写入 ~/.bashrc)
echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi/gcc-arm-none-eabi-10.3-2021.07/bin' >> ~/.bashrc
source ~/.bashrc
# 4. 验证安装
arm-none-eabi-gcc --version
小技巧: 解压后可以顺手把压缩包删了,省点磁盘空间。另外,我习惯在 /opt 下建一个软链接,方便以后切换版本:
sudo ln -sf /opt/gcc-arm-none-eabi/gcc-arm-none-eabi-10.3-2021.07 /opt/gcc-arm-none-eabi/current
export PATH=$PATH:/opt/gcc-arm-none-eabi/current/bin
3.2 安装CMake
CMake是干什么的?它不直接编译代码,而是生成Makefile。你想想看,PX4有几百个源文件,依赖关系错综复杂,总不能让人手写Makefile吧?CMake就是来解决这个问题的。
PX4对CMake的版本要求不算苛刻,但太老的版本也不行。我个人建议装3.20以上版本。
# 方法一:apt安装(版本可能较旧)
sudo apt-get install cmake
# 方法二:从官方获取最新版(推荐)
wget https://github.com/Kitware/CMake/releases/download/v3.27.6/cmake-3.27.6-linux-x86_64.tar.gz
sudo tar xzf cmake-3.27.6-linux-x86_64.tar.gz -C /opt
echo 'export PATH=$PATH:/opt/cmake-3.27.6-linux-x86_64/bin' >> ~/.bashrc
source ~/.bashrc
# 验证
cmake --version
嗯,这里要注意一点:如果你用apt装了旧版CMake,又手动装了新版,记得检查PATH的优先级。我曾经遇到过终端里敲cmake --version显示的是新版,但编译时却调用了旧版,折腾了半天才发现是环境变量顺序的问题。
3.3 安装Make
Make本身没什么好说的,Ubuntu系统一般自带。但有个坑——PX4推荐用 Ninja 替代Make。Ninja比Make更快,尤其适合大型项目。
# 安装Ninja
sudo apt-get install ninja-build
# 验证
ninja --version
怎么用呢?在编译PX4时加一个参数就行:
# 使用Make(默认)
make px4_fmu-v5_default
# 使用Ninja(更快)
make px4_fmu-v5_default -j4 CONFIG=ninja
我个人习惯用Ninja,编译速度能快30%左右。尤其是你改了一行代码想重新编译时,Ninja的增量编译效率高得多。
3.4 验证工具链是否正常工作
工具都装好了,怎么知道能不能用?别急着编译整个PX4,先跑个小测试。
# 写一个简单的C程序
cat > test.c << EOF
#include <stdio.h>
int main() {
printf("Hello PX4!\n");
return 0;
}
EOF
# 用交叉编译器编译
arm-none-eabi-gcc -c test.c -o test.o
# 查看生成的目标文件信息
arm-none-eabi-objdump -f test.o
如果看到输出里有 file format elf32-littlearm 之类的字样,说明交叉编译器工作正常。你编译出来的目标文件是ARM格式的,不是x86格式的。
避坑指南: 我曾经遇到过一个问题——编译出来的固件刷进去后,飞控完全没反应。排查到最后发现,是交叉编译器版本不对,导致生成的启动代码有问题。所以,一定要用PX4官方推荐的版本,别自己瞎升级。
3.5 环境变量配置总结
把上面所有路径加到 ~/.bashrc 里,一劳永逸:
# GCC交叉编译器
export PATH=$PATH:/opt/gcc-arm-none-eabi/current/bin
# CMake
export PATH=$PATH:/opt/cmake-3.27.6-linux-x86_64/bin
# Ninja(如果apt安装的,一般不需要手动加PATH)
export PATH=$PATH:/usr/bin/ninja
# 生效
source ~/.bashrc
配置完成后,建议重启终端或者重新登录一下用户,确保环境变量彻底生效。
| 工具 | 版本要求 | 安装方式 | 验证命令 |
|---|---|---|---|
| GCC交叉编译器 | 10.3-2021.07 | 手动安装到 /opt | arm-none-eabi-gcc --version |
| CMake | ≥ 3.20 | 手动安装到 /opt | cmake --version |
| Ninja | 最新版即可 | apt install | ninja --version |
好了,工具链这块就这些。说白了就是三个东西:GCC负责翻译,CMake负责组织,Make/Ninja负责执行。装的时候注意版本,配环境变量时注意路径优先级,基本不会出大问题。
下一章我们会用这套工具链,真正动手编译一次PX4固件。到时候你会发现,前面这些配置工作,其实都是在给后面的「万里长征」铺路。