4、编译工具链搭建:GCC交叉编译器安装、CMake构建系统配置、MAVSDK安装、依赖库检查
好,到了第四步。这一步说白了,就是给你的开发环境「装上发动机和方向盘」。没有交叉编译器,你写的代码跑不到飞控硬件上;没有 CMake,项目一复杂你就得疯;没有 MAVSDK,你连跟无人机说句话都费劲。
我记得我第一次搭 PX4 环境时,光装依赖就折腾了一下午。后来发现,很多坑其实是可以提前避开的。今天咱们就把这些工具链一次理清楚。
4.1 GCC交叉编译器:为什么需要它?
你平时在电脑上写代码,编译器生成的是 x86_64 的机器码。但飞控芯片(比如 STM32F4、STM32H7)是 ARM 架构的。交叉编译器的作用,就是在你的 PC 上生成能在 ARM 芯片上跑的程序。
说白了,就是「跨平台编译」。
核心概念: 交叉编译器 = 运行在 Host(你的电脑)上,生成 Target(飞控)可执行文件的工具链。
我建议你直接用 ARM 官方维护的 GNU Arm Embedded Toolchain。别自己从源码编译,那是个无底洞。
安装步骤(Ubuntu 20.04/22.04)
# 添加 PPA 源(官方推荐)
sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
sudo apt update
# 安装
sudo apt install gcc-arm-none-eabi
# 验证安装
arm-none-eabi-gcc --version
输出类似这样,就说明装好了:
arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10.3-2021.10) 10.3.1 20210824
Copyright (C) 2020 Free Software Foundation, Inc.
小技巧: 如果你在 macOS 上,用 brew install arm-none-eabi-gcc 就行。Windows 用户建议用 WSL2,别在原生 Windows 上折腾,我试过,坑太多。
4.2 CMake构建系统配置
CMake 是什么?它不直接编译代码,而是生成 Makefile 或 Ninja 构建文件。PX4、MAVSDK 这些项目都用它来管理编译流程。
你想想看,一个飞控项目有成百上千个源文件,手动写 Makefile 会写到崩溃。CMake 帮你自动处理依赖关系、编译器选项、链接脚本。
安装 CMake
# Ubuntu 直接装
sudo apt install cmake
# 检查版本(建议 3.16+)
cmake --version
如果版本太低,我建议你从 CMake 官网 下载预编译的二进制包,解压后加到 PATH 里。
注意: 不要用 sudo apt install cmake 装到太老的版本(比如 3.10)。PX4 和 MAVSDK 对 CMake 版本有最低要求。我曾经因为版本问题卡了一整天,最后发现是 CMake 太旧,不支持某些语法。
CMake 基础配置示例
这里给你看一个典型的 CMakeLists.txt 片段,用于交叉编译:
# 设置交叉编译器
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
# 设置目标架构
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)
# 编译选项
set(CMAKE_C_FLAGS "-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
这段代码告诉 CMake:用 ARM 交叉编译器,目标芯片是 Cortex-M4,启用硬件浮点。嗯,这里要注意,-mcpu 参数一定要跟你飞控的芯片型号匹配。
4.3 MAVSDK安装
MAVSDK 是跟无人机通信的 SDK。它封装了 MAVLink 协议,让你用几行 C++ 代码就能控制无人机起飞、降落、改变航点。
我个人习惯用源码编译安装,这样能保证版本最新,而且可以自己加调试选项。
源码编译安装 MAVSDK
# 克隆仓库
git clone https://github.com/mavlink/MAVSDK.git
cd MAVSDK
# 初始化子模块
git submodule update --init --recursive
# 创建构建目录
mkdir build && cd build
# 配置(默认安装到 /usr/local)
cmake -DCMAKE_BUILD_TYPE=Release ..
# 编译(-j 后面的数字是你的 CPU 核心数)
make -j4
# 安装
sudo make install
加速技巧: 如果你只需要 C++ 库,不需要 Python 绑定,可以加 -DBUILD_PYTHON=OFF 参数,能省不少编译时间。
验证安装
装完后,检查头文件和库文件是否到位:
# 头文件应该在 /usr/local/include/mavsdk/
ls /usr/local/include/mavsdk/
# 库文件
ls /usr/local/lib/libmavsdk*
如果看到 libmavsdk.so 或 libmavsdk.a,就说明装好了。
4.4 依赖库检查
这一步最容易出问题。很多新手装完工具链就开始编译,结果报错说缺这个库缺那个库。我建议你养成习惯:编译前先跑一遍依赖检查。
PX4 飞控固件的依赖
如果你要编译 PX4 固件,需要这些依赖:
| 依赖库 | 用途 | 安装命令 |
|---|---|---|
| python3-pip | Python 包管理 | sudo apt install python3-pip |
| ninja-build | 高速构建工具 | sudo apt install ninja-build |
| protobuf-compiler | 序列化协议 | sudo apt install protobuf-compiler |
| libeigen3-dev | 线性代数库 | sudo apt install libeigen3-dev |
| libopencv-dev | 计算机视觉(可选) | sudo apt install libopencv-dev |
避坑指南: 我曾经在 Ubuntu 20.04 上装 protobuf,系统自带的版本是 3.6,但 PX4 需要 3.12+。结果编译到一半报错,查了半天才发现是 protobuf 版本太老。解决办法是手动从源码编译 protobuf 3.12 或更高版本。
一键检查脚本
我写了个小脚本,帮你快速检查关键依赖是否就绪:
#!/bin/bash
echo "=== 工具链检查 ==="
# 检查 GCC 交叉编译器
if command -v arm-none-eabi-gcc &> /dev/null; then
echo "[OK] arm-none-eabi-gcc 已安装"
else
echo "[FAIL] arm-none-eabi-gcc 未安装"
fi
# 检查 CMake
if command -v cmake &> /dev/null; then
echo "[OK] cmake 已安装: $(cmake --version | head -1)"
else
echo "[FAIL] cmake 未安装"
fi
# 检查 MAVSDK
if [ -f /usr/local/include/mavsdk/mavsdk.h ]; then
echo "[OK] MAVSDK 头文件存在"
else
echo "[FAIL] MAVSDK 头文件未找到"
fi
# 检查 Python3
if command -v python3 &> /dev/null; then
echo "[OK] python3 已安装"
else
echo "[FAIL] python3 未安装"
fi
把这段代码保存为 check_toolchain.sh,然后 chmod +x check_toolchain.sh && ./check_toolchain.sh。看到四个 OK,你就可以放心进行下一步了。
4.5 知识体系总览
下面这张图,帮你把今天讲的内容串起来:
这张图把今天的内容分成了四个模块。你按这个顺序来,基本不会出错。先装交叉编译器,再配 CMake,然后装 MAVSDK,最后跑一遍依赖检查。每一步都验证通过,再往下走。
我的建议: 别急着一次装完所有东西。装一个,验证一个。出了问题,你能立刻知道是哪个环节的锅。我见过太多人一口气装完,编译报错时完全不知道从哪查起。