4、PX4编译工具链安装:安装ARM GCC、CMake、Ninja、Python依赖
好,咱们进入实战环节的第一个硬骨头——编译工具链安装。
说实话,很多新手在PX4开发上栽跟头,十有八九是卡在这一步。不是装错了版本,就是环境变量没配好。我个人习惯是先把工具链理清楚,再动手装。你想想看,编译一个飞控固件,本质上就是把我们写的C++代码,翻译成STM32或者STM32F7这类芯片能跑的机器码。那谁来干这个翻译的活?就是ARM GCC。
4.1 为什么需要这些工具?
先简单过一遍,每个工具是干嘛的:
- ARM GCC:交叉编译器。把代码编译成ARM架构的二进制文件。我刚开始做飞控时,用PC上的GCC去编译,结果固件刷进去板子根本不跑——后来才意识到,PC是x86架构,飞控是ARM架构,编译器必须用交叉编译版本。
- CMake:构建系统生成器。PX4的代码组织很复杂,CMake负责管理编译流程,告诉编译器哪些文件要编译、怎么链接。
- Ninja:比Make更快的构建工具。说白了,Ninja就是Make的升级版,编译速度能快不少。我实测过,同样一个固件,Ninja比Make快30%左右。
- Python依赖:PX4的编译脚本、代码生成工具、测试框架,大量依赖Python。比如px4_uploader.py这个上传工具,就是Python写的。
核心要点:这四个工具缺一不可,而且版本必须匹配。我曾经帮一个学员排查编译错误,折腾了两小时,最后发现是他ARM GCC版本太新,跟PX4的旧版代码不兼容。
4.2 安装ARM GCC
ARM GCC的安装,我推荐用官方提供的预编译包。别用系统自带的包管理器去装,版本往往太老。
步骤一:下载ARM GCC
去ARM官方下载页面,找到“GNU Arm Embedded Toolchain”。选最新稳定版就行,别追最新版。我个人习惯用10.3-2021.10这个版本,稳得很。
# 以Ubuntu 20.04为例,下载并解压
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
sudo mv gcc-arm-none-eabi-10.3-2021.10 /opt/
步骤二:配置环境变量
把ARM GCC的bin目录加到PATH里。我建议写到~/.bashrc里,这样每次打开终端自动生效。
echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin' >> ~/.bashrc
source ~/.bashrc
步骤三:验证安装
arm-none-eabi-gcc --version
如果看到版本号输出,说明装好了。嗯,这里要注意:如果提示“命令未找到”,八成是PATH没配对,检查一下路径。
避坑指南:我曾经遇到过一个问题——装了两个版本的ARM GCC,一个在/usr/bin,一个在/opt。结果编译时调用了旧版本,报了一堆莫名其妙的链接错误。解决方案:用which arm-none-eabi-gcc确认当前用的是哪个版本,把不需要的删掉。
4.3 安装CMake
CMake的安装相对简单。Ubuntu下直接用apt装就行,但版本有要求。PX4官方要求CMake 3.10.2以上。我个人建议装3.20以上版本,功能更全。
# 方法一:apt安装(版本可能较旧)
sudo apt install cmake
# 方法二:从源码安装(推荐,版本可控)
wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1.tar.gz
tar -xzf cmake-3.22.1.tar.gz
cd cmake-3.22.1
./bootstrap
make -j4
sudo make install
验证一下:
cmake --version
你想想看,CMake其实是个“项目经理”,它不直接编译代码,而是生成编译规则文件(Makefile或Ninja.build)。所以CMake版本不对,生成的规则可能就有问题。
4.4 安装Ninja
Ninja的安装更简单。Ubuntu下一条命令搞定:
sudo apt install ninja-build
验证:
ninja --version
Ninja的好处是快。我做过对比:用Make编译PX4固件,大概需要8分钟;用Ninja,5分钟出头就搞定了。对于频繁修改代码的开发者来说,这省下来的时间很可观。
小技巧:如果你在编译时想指定用Ninja,可以在CMake配置时加上-G Ninja参数。比如:cmake -G Ninja ..。这样CMake就会生成Ninja的构建文件,而不是默认的Makefile。
4.5 安装Python依赖
PX4的Python依赖都写在requirements.txt文件里。我建议用虚拟环境来装,避免污染系统Python。
# 安装pip和virtualenv
sudo apt install python3-pip python3-venv
# 创建虚拟环境
python3 -m venv px4_venv
source px4_venv/bin/activate
# 安装PX4依赖
pip install -r requirements.txt
requirements.txt里主要包含这些包:
| 包名 | 用途 |
|---|---|
| numpy | 数值计算,用于EKF等算法 |
| pyserial | 串口通信,用于固件上传 |
| jinja2 | 模板引擎,用于代码生成 |
| kconfiglib | 配置系统,用于menuconfig |
我记得有一次,一个学员编译时老是报“ModuleNotFoundError: No module named 'numpy'”。一查,他根本没装Python依赖。所以这一步千万别跳过。
4.6 完整安装脚本
为了方便,我写了一个一键安装脚本。你直接复制运行就行:
#!/bin/bash
# PX4编译工具链一键安装脚本
# 适用于Ubuntu 20.04/22.04
set -e
echo "=== 安装系统依赖 ==="
sudo apt update
sudo apt install -y \
git zip cmake ninja-build \
python3-pip python3-venv \
libxml2-dev libxslt1-dev
echo "=== 安装ARM GCC ==="
wget -q https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
sudo mv gcc-arm-none-eabi-10.3-2021.10 /opt/
echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin' >> ~/.bashrc
source ~/.bashrc
echo "=== 安装Python依赖 ==="
python3 -m venv px4_venv
source px4_venv/bin/activate
pip install --upgrade pip
pip install numpy pyserial jinja2 kconfiglib
echo "=== 验证安装 ==="
arm-none-eabi-gcc --version
cmake --version
ninja --version
python3 -c "import numpy; print('numpy OK')"
echo "=== 安装完成 ==="
重要提醒:每次编译PX4前,记得先激活Python虚拟环境:source px4_venv/bin/activate。不然会提示找不到模块。
4.7 常见问题排查
我总结几个高频问题,你遇到了可以直接对照:
- 编译时报“arm-none-eabi-gcc: not found”:环境变量没配好。检查
echo $PATH里有没有ARM GCC的路径。 - 编译时报“CMake Error: Could not find cmake”:CMake没装或者版本太旧。用
cmake --version确认。 - 编译时报“ImportError: No module named 'jinja2'”:Python依赖没装全。激活虚拟环境后重新
pip install -r requirements.txt。 - 编译速度特别慢:检查是不是用了Make而不是Ninja。用
make px4_fmu-v5_default会慢,换成ninja px4_fmu-v5_default试试。
好了,工具链装完,下一章咱们就开始拉取PX4源码,真正编译第一个固件。到时候你会发现,前面这些折腾都是值得的。