3. 编译工具链:GCC交叉编译器、CMake、Make工具安装与配置

好,咱们接着往下走。上一章我们把Ubuntu系统跑起来了,也把PX4源码拉到了本地。但源码是源码,它只是一堆文本文件。要让这些文本变成能在飞控板上运行的二进制固件,中间还隔着一道关键的工序——编译

说白了,编译就是把人类能读懂的C/C++代码,翻译成芯片能执行的机器指令。而完成这个翻译工作的,就是咱们这章要讲的编译工具链

我个人习惯把工具链比作一个「翻译团队」:GCC是那个懂外语的翻译官,CMake是项目经理,Make则是那个拿着任务清单、指挥大家干活的工头。缺了谁,这活都干不利索。

核心逻辑: 在PC(x86架构)上编译出能在ARM架构的STM32芯片上运行的程序,这叫「交叉编译」。所以我们需要的是「交叉编译器」,而不是你电脑上自带的那个GCC。

编译工具链工作流程 PX4 源码 (.c/.h) CMake (项目经理) Make (工头) GCC (翻译官) 固件文件 (.px4 / .bin) CMake生成构建规则 → Make调度编译任务 → 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固件。到时候你会发现,前面这些配置工作,其实都是在给后面的「万里长征」铺路。


专注资料整理