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 知识体系总览

下面这张图,帮你把今天讲的内容串起来:

编译工具链知识体系 编译工具链搭建 — 知识体系 SITL 编译工具链 GCC 交叉编译器 CMake 构建系统 MAVSDK 通信库 依赖库检查 arm-none-eabi-gcc CMakeLists.txt 配置 源码编译 / 安装验证 protobuf / eigen3 / ninja 四个组件缺一不可,建议按顺序安装并逐一验证

这张图把今天的内容分成了四个模块。你按这个顺序来,基本不会出错。先装交叉编译器,再配 CMake,然后装 MAVSDK,最后跑一遍依赖检查。每一步都验证通过,再往下走。

我的建议: 别急着一次装完所有东西。装一个,验证一个。出了问题,你能立刻知道是哪个环节的锅。我见过太多人一口气装完,编译报错时完全不知道从哪查起。