3. 开发环境搭建(Linux篇):安装依赖包、下载GCC工具链、配置环境变量、验证编译环境

好,咱们正式开始动手了。这一章我带你把Linux下的开发环境搭起来。说实话,很多初学者卡在这一步,不是技术多难,而是细节没注意。我当年第一次搭NuttX环境时,光装依赖就折腾了两小时——后来发现是源的问题。嗯,咱们今天把这些坑都填平。

本章核心目标:在Linux系统上搭建完整的NuttX + STM32编译环境,确保能成功编译出一个可运行的二进制文件。

3.1 安装系统依赖包

NuttX的构建系统依赖不少工具。说白了,它需要一套完整的GNU工具链来支撑。我个人习惯用Ubuntu 20.04或22.04 LTS,这两个版本我验证过多次,兼容性最好。

打开终端,执行以下命令:

sudo apt update
sudo apt install -y \
  build-essential \
  git \
  flex \
  bison \
  libncurses-dev \
  libgmp-dev \
  libmpfr-dev \
  libmpc-dev \
  libssl-dev \
  libelf-dev \
  python3 \
  python3-pip \
  python3-venv \
  u-boot-tools \
  device-tree-compiler \
  cmake \
  ninja-build

这里我重点说几个容易忽略的:

  • flex 和 bison:NuttX的配置系统需要它们生成解析器。缺了的话,make menuconfig会直接报错。
  • libncurses-dev:没有它,菜单配置界面显示会乱码。我在项目中遇到过一回,界面全是问号,排查了半天才发现是这玩意儿没装。
  • python3-venv:NuttX 12.0之后开始用Python脚本做构建辅助,虚拟环境能避免包冲突。

小技巧:如果你用的是Debian系的其他发行版,包名基本一致。但如果是Arch或Fedora,包名会略有不同。建议先查一下对应发行版的软件包搜索工具。

3.2 下载GCC交叉编译工具链

STM32是ARM Cortex-M内核,所以我们需要ARM的交叉编译器。这里我推荐用ARM官方维护的GNU Arm Embedded Toolchain,稳定且更新及时。

下载地址:https://developer.arm.com/downloads/-/gnu-rm

我个人习惯用10.3-2021.10这个版本,因为NuttX官方CI用的就是这个版本,兼容性最好。你想想看,如果工具链版本太新,某些语法可能不兼容;太旧又可能缺特性。10.3这个版本我用了两年,没出过问题。

下载并解压:

# 下载(以10.3-2021.10为例)
wget 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

# 解压到 /opt 目录
sudo tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /opt/

# 重命名(方便管理)
sudo mv /opt/gcc-arm-none-eabi-10.3-2021.10 /opt/gcc-arm-none-eabi

注意:解压路径建议放在/opt下,不要放在/usr/local。因为/opt是专门放第三方软件的,方便后续多版本管理。我曾经图省事放家目录,结果换电脑时忘了备份,又得重新下载。

3.3 配置环境变量

环境变量配置其实就两件事:让系统找到编译器,以及让NuttX的构建脚本知道工具链在哪。

编辑 ~/.bashrc~/.zshrc(取决于你用的shell),在末尾添加:

# ARM GCC 工具链
export PATH="/opt/gcc-arm-none-eabi/bin:$PATH"

# NuttX 相关(后面会用到)
export NUTTX_PATH="$HOME/nuttx"
export PATH="$NUTTX_PATH/tools:$PATH"

然后使配置生效:

source ~/.bashrc

这里有个细节:PATH的顺序很重要。我把工具链路径放在前面,是为了优先使用我们安装的版本,避免和系统自带的gcc冲突。你想想看,如果系统自带的gcc被误调用,编译ARM代码肯定报错。

避坑指南:我曾经遇到过一个问题——明明配置了环境变量,但终端重启后又失效了。后来发现是.bashrc文件权限不对。记得检查一下:chmod 644 ~/.bashrc

3.4 验证编译环境

环境搭没搭好,跑个命令就知道了。先验证编译器本身:

arm-none-eabi-gcc --version

你应该能看到类似这样的输出:

arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10.3-2021.10) 10.3.1 20210824 (release)
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

如果提示"command not found",说明环境变量没配好。回头检查一下路径写对了没。

接下来,我们写一个简单的测试程序,验证交叉编译是否正常:

# 创建一个测试目录
mkdir -p ~/test_nuttx && cd ~/test_nuttx

# 写一个简单的C文件
cat > test.c << 'EOF'
#include <stdio.h>

int main(void) {
    printf("Hello, NuttX on STM32!\n");
    return 0;
}
EOF

# 编译(注意:这里只是测试工具链,实际NuttX编译方式不同)
arm-none-eabi-gcc -c test.c -o test.o -mcpu=cortex-m4 -mthumb

# 查看生成的目标文件
arm-none-eabi-objdump -h test.o

如果能看到段信息(.text、.data等),说明工具链工作正常。最后清理测试文件:

rm -rf ~/test_nuttx

验证要点:

  • arm-none-eabi-gcc --version 能正常显示版本号
  • arm-none-eabi-objdump 等工具也能找到
  • 交叉编译出的目标文件是ARM架构的(可以用file test.o查看)

3.5 知识体系总览

为了让你对整个环境搭建有个全局认识,我画了一张流程图:

NuttX开发环境搭建流程 安装系统依赖包 build-essential, git, flex... 下载GCC工具链 ARM GCC 10.3-2021.10 配置环境变量 PATH, NUTTX_PATH 验证环境 编译测试 各步骤关键点: 1. 依赖包:flex/bison用于配置系统,libncurses用于菜单界面 2. 工具链:推荐ARM官方10.3版本,解压到/opt目录 3. 环境变量:PATH顺序重要,工具链路径放前面 4. 验证:arm-none-eabi-gcc --version + 交叉编译测试 常见问题: • command not found → 检查PATH配置 • 编译报错 → 检查依赖包是否完整安装

3.6 常见问题与解决

问题现象 可能原因 解决方法
arm-none-eabi-gcc: command not found 环境变量未配置或路径错误 检查~/.bashrc中的PATH设置,执行source ~/.bashrc
make menuconfig界面乱码 缺少libncurses-dev sudo apt install libncurses-dev
编译时报错"cannot find -lxxx" 缺少对应的库文件 检查依赖包是否完整安装,特别是libgmp、libmpfr等
Python脚本报错 Python版本或虚拟环境问题 确保Python 3.8+,使用python3 -m venv创建虚拟环境

重要提醒:如果你用的是Windows WSL2,记得把项目放在Linux文件系统下(如/home/username/),不要放在/mnt/c/下。WSL2访问Windows文件系统有性能问题,而且权限管理容易出幺蛾子。我有个学员就是放/mnt下,编译时各种权限报错,折腾了一下午。

好了,环境搭建就到这里。你现在应该能顺利看到arm-none-eabi-gcc的版本信息了。下一节我们就要真正拉取NuttX源码,开始配置STM32的工程了。嗯,先把基础打牢,后面才跑得快。


专注资料整理