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 知识体系总览
为了让你对整个环境搭建有个全局认识,我画了一张流程图:
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的工程了。嗯,先把基础打牢,后面才跑得快。