4、编译工具链安装:GCC交叉编译器、CMake、Ninja、Python依赖包安装
好,咱们进入正题。上一章我们把 Ubuntu 系统跑起来了,现在该给 PX4 准备吃饭的家伙——编译工具链。
说白了,工具链就是一套能把你的 C++ 代码变成飞控固件的工具集合。我刚开始接触时也觉得这东西很玄乎,装了一堆东西也不知道干嘛用的。后来踩了几次坑才明白,每个工具都有自己的活。
核心思路:PX4 固件不是在 PC 上跑的,它要跑到 STM32 芯片上。所以我们需要一个「交叉编译器」——在 PC 上编译,生成 ARM 架构的机器码。再加上 CMake 和 Ninja 来管理构建流程,Python 用来跑脚本。
4.1 整体架构:工具链各司其职
先看一张图,把今天要装的东西串起来。这样你心里有个谱,不会装完还一头雾水。
这张图把流程讲清楚了:源码 → CMake 生成规则 → Ninja 调度编译 → GCC 交叉编译 → 固件输出。Python 包是辅助角色,但缺了它编译脚本跑不起来。
4.2 安装 GCC ARM 交叉编译器
这是最核心的部分。GCC 交叉编译器负责把代码编译成 ARM 架构的机器码。我个人的习惯是直接用 PX4 官方推荐的版本,不要自己随便下最新的——版本不匹配会出各种奇怪的问题。
版本陷阱:PX4 官方推荐使用 gcc-arm-none-eabi-9-2020-q2-update 或更新的 10-2020-q4 版本。太老的版本(比如 7.x)编译新固件会报错,太新的版本(比如 12.x)也可能有兼容性问题。我去年就吃过这个亏,用了个 11.x 版本,编译死活过不去,折腾了两天才发现是编译器版本问题。
安装步骤很简单,就三步:
- 下载编译器包——从 ARM 官网或 PX4 工具链镜像站下载
- 解压到指定目录——我习惯放在
/opt/gcc-arm-none-eabi - 配置环境变量——把编译器路径加到
PATH里
具体命令如下:
# 下载(以 9-2020-q2-update 为例)
wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/9-2020-q2-update/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2
# 解压到 /opt
sudo tar -xjf gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2 -C /opt/
# 添加环境变量(写入 ~/.bashrc)
echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi-9-2020-q2-update/bin' >> ~/.bashrc
# 使环境变量生效
source ~/.bashrc
# 验证安装
arm-none-eabi-gcc --version
验证成功的话,你会看到类似这样的输出:
arm-none-eabi-gcc (GNU Arm Embedded Toolchain 9-2020-q2-update) 9.3.1 20200408 (release)
Copyright (C) 2019 Free Software Foundation, Inc.
小技巧:如果你网络不好,可以从 PX4 的 GitHub Releases 页面找工具链的百度网盘链接。国内很多开发者都这么干,速度能快不少。
4.3 安装 CMake
CMake 是个构建系统生成器。它不直接编译代码,而是根据 CMakeLists.txt 生成 Ninja 或 Make 能识别的构建规则。PX4 从 v1.12 开始全面转向 CMake + Ninja 组合,所以 CMake 是必须的。
Ubuntu 20.04 自带的 CMake 版本是 3.16,但 PX4 要求至少 3.19 以上。所以别偷懒用 apt install cmake,那个版本太旧了。
我建议用官方提供的安装脚本,一行搞定:
# 安装 CMake(官方推荐方式)
sudo apt update
sudo apt install -y cmake
# 检查版本
cmake --version
如果版本低于 3.19,需要手动安装新版:
# 下载 CMake 3.22.1
wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1-linux-x86_64.tar.gz
# 解压
tar -xzf cmake-3.22.1-linux-x86_64.tar.gz -C /opt/
# 创建软链接(覆盖系统默认 cmake)
sudo ln -sf /opt/cmake-3.22.1-linux-x86_64/bin/* /usr/local/bin/
# 验证
cmake --version
为什么不用 Make?Ninja 比 Make 快很多,尤其是大型项目。PX4 有上千个源文件,用 Make 编译一次要十几分钟,Ninja 能压到 5-8 分钟。说白了,Ninja 就是为「快」而生的。
4.4 安装 Ninja
Ninja 是个轻量级的构建系统,专注于「快」。它不像 Make 那样有复杂的语法,而是直接读取 CMake 生成的 build.ninja 文件,然后并行执行编译任务。
安装 Ninja 很简单:
# 直接 apt 安装
sudo apt install -y ninja-build
# 验证
ninja --version
如果 apt 里的版本太旧,也可以从 GitHub 下载二进制:
# 下载 Ninja 1.10.2
wget https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-linux.zip
# 解压到 /usr/local/bin
sudo unzip ninja-linux.zip -d /usr/local/bin/
# 验证
ninja --version
个人经验:Ninja 默认会使用所有 CPU 核心并行编译。如果你在虚拟机里跑,建议限制一下核心数,不然虚拟机容易卡死。可以在编译时加 -j4 参数限制为 4 核。
4.5 安装 Python 依赖包
PX4 的编译脚本、上传工具、日志解析都用到了 Python。所以需要安装一些 Python 包。我建议用 Python 3.8+,Ubuntu 20.04 默认就是 3.8,刚好。
先确保 pip 是最新的:
# 安装 pip
sudo apt install -y python3-pip
# 升级 pip
pip3 install --upgrade pip
然后安装 PX4 需要的依赖包:
# 安装核心依赖
pip3 install --user pyserial pyulog numpy kconfiglib
# 验证
python3 -c "import pyserial; print('pyserial OK')"
python3 -c "import pyulog; print('pyulog OK')"
python3 -c "import numpy; print('numpy OK')"
python3 -c "import kconfiglib; print('kconfiglib OK')"
各包的作用如下:
| 包名 | 作用 | 是否必须 |
|---|---|---|
| pyserial | 串口通信,用于固件上传和调试 | 是 |
| pyulog | 解析 PX4 的 .ulog 日志文件 | 是 |
| numpy | 数值计算,部分脚本依赖 | 是 |
| kconfiglib | 解析 Kconfig 配置,用于菜单配置 | 是 |
注意:不要用 sudo pip install,这会把包装到系统 Python 目录,容易和系统包冲突。用 --user 参数装到用户目录更安全。我曾经手贱用了 sudo,结果把系统 Python 搞坏了,重装了系统才恢复。
4.6 验证工具链是否安装完整
装完所有东西后,建议跑一个快速验证脚本。PX4 官方提供了一个检查脚本:
# 下载 PX4 源码(如果还没下载)
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
# 运行工具链检查
make check_toolchain
如果一切正常,你会看到类似这样的输出:
Toolchain check passed!
- cmake: /usr/local/bin/cmake (3.22.1)
- ninja: /usr/bin/ninja (1.10.2)
- arm-none-eabi-gcc: /opt/gcc-arm-none-eabi-9-2020-q2-update/bin/arm-none-eabi-gcc (9.3.1)
- python3: /usr/bin/python3 (3.8.10)
- pip packages: pyserial, pyulog, numpy, kconfiglib
避坑指南:如果 make check_toolchain 报错说找不到某个工具,别慌。先检查环境变量有没有配对,再确认版本是否满足要求。我遇到过最坑的一次是 PATH 里有两个不同版本的 GCC,系统用了旧版本,折腾了半天才发现。
4.7 常见问题与解决方案
这里列几个我实际遇到过的问题,你碰到了可以直接查:
| 问题 | 原因 | 解决方法 |
|---|---|---|
arm-none-eabi-gcc: command not found |
环境变量没配好 | 检查 ~/.bashrc 中的 PATH 配置,重新 source |
CMake Error: Could not find cmake module |
CMake 版本太低 | 手动安装 CMake 3.19+ |
ninja: build stopped: subcommand failed |
编译错误,通常是代码或依赖问题 | 查看具体错误信息,常见于 GCC 版本不匹配 |
ModuleNotFoundError: No module named 'pyserial' |
Python 包没装或装错位置 | 用 pip3 install --user pyserial 重新安装 |
嗯,到这里工具链就装完了。你可能会觉得步骤有点多,但相信我,这一步走稳了,后面编译固件就是一马平川的事。我当初第一次装的时候也花了将近一个小时,后来熟练了十分钟搞定。