3、ARM交叉编译器安装:下载并安装 ARM GCC 交叉编译器,配置环境变量与验证
好,咱们接着往下走。上一节我们把基础环境搞定了,这一节要干一件核心的事——装ARM交叉编译器。
说白了,交叉编译器就是让你在PC上写代码,编译出来的程序能在ARM芯片上跑。我刚开始接触飞控开发时,总觉得这东西很神秘,后来发现其实就是一套工具链,没那么玄乎。
3.1 为什么需要交叉编译器?
你想想看,咱们的飞控中间件最终要跑在STM32、NXP这类ARM芯片上。但你的开发电脑是x86架构的,直接编译出来的程序ARM芯片不认识。
交叉编译器的作用,就是在x86电脑上生成ARM机器码。我习惯把它比作「翻译官」——把x86世界的C代码,翻译成ARM世界能执行的二进制文件。
核心概念:交叉编译 = 在A架构上编译出B架构的程序。这里A是x86,B是ARM。
3.2 下载ARM GCC工具链
ARM官方提供了现成的GCC工具链,我们直接拿来用就行。我个人推荐用gcc-arm-none-eabi这个版本,它专门针对裸机或RTOS环境,飞控中间件正好用得上。
下载地址:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm
选择对应你操作系统的版本:
| 操作系统 | 推荐包名 | 说明 |
|---|---|---|
| Linux (x86_64) | gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 | 我主要用这个,稳定 |
| Windows | gcc-arm-none-eabi-10.3-2021.10-win32.zip | 解压即用,注意路径别带中文 |
| macOS | gcc-arm-none-eabi-10.3-2021.10-mac.tar.bz2 | M1/M2芯片也能用 |
我的经验:版本别追太新。10.3这个版本我用了两年,飞控项目从来没出过编译器兼容问题。新版本有时候反而会引入一些奇怪的警告。
3.3 安装步骤(以Linux为例)
下载完成后,解压到你想放的目录。我习惯放在/opt下,这样所有用户都能用。
# 解压
tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
# 移动到/opt目录
sudo mv gcc-arm-none-eabi-10.3-2021.10 /opt/
# 查看是否解压成功
ls /opt/gcc-arm-none-eabi-10.3-2021.10/bin/
你会看到一堆以arm-none-eabi-开头的可执行文件。比如arm-none-eabi-gcc、arm-none-eabi-g++、arm-none-eabi-objcopy等等。这些就是我们的工具链。
注意:Windows用户解压后,建议放在C:\ARM_GCC这种纯英文路径下。我曾经见过有人放在「桌面」里,结果编译报错半天找不到原因——路径里有中文空格,坑得很。
3.4 配置环境变量
环境变量配置,说白了就是告诉系统:「我的编译器在哪儿」。这样你在任何目录下敲arm-none-eabi-gcc都能找到它。
我个人习惯修改~/.bashrc文件,这样只对当前用户生效,不影响系统全局。
# 编辑bashrc
vim ~/.bashrc
# 在文件末尾添加以下内容
export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin
# 保存退出后,使配置生效
source ~/.bashrc
Windows用户配置环境变量:
- 右键「此电脑」→「属性」→「高级系统设置」
- 点击「环境变量」
- 在「系统变量」中找到Path,双击编辑
- 添加你的解压路径,比如
C:\ARM_GCC\bin - 一路点确定保存
避坑指南:我曾经在配置环境变量时,不小心把原来的Path覆盖了,结果系统一堆命令找不到了。所以建议你编辑时,先复制一份原来的内容备份一下。
3.5 验证安装是否成功
配置完环境变量,咱们得验证一下。打开终端,输入:
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.
再试试编译一个简单的C文件,验证交叉编译功能:
# 写一个测试文件
echo '#include <stdio.h>
int main() {
printf("Hello from ARM!\n");
return 0;
}' > test.c
# 交叉编译
arm-none-eabi-gcc -c test.c -o test.o
# 查看生成的文件类型
file test.o
输出应该包含ELF 32-bit LSB relocatable, ARM字样,说明确实是ARM架构的目标文件。
验证要点:
--version能正常显示版本号- 编译出的
.o文件是ARM格式 - 工具链中的其他命令也能用,比如
arm-none-eabi-objdump
3.6 常见问题与解决
嗯,这里我总结几个我踩过的坑:
- 「command not found」:八成是环境变量没配好,或者没执行
source ~/.bashrc。重新检查一下路径对不对。 - 「Permission denied」:解压出来的文件可能没有执行权限。执行
chmod +x /opt/gcc-arm-none-eabi-10.3-2021.10/bin/*解决。 - 「arm-none-eabi-gcc: not found」:如果是Windows,检查一下Path里有没有分号分隔,路径末尾有没有加
\bin。
我曾经在一个项目里,因为编译器版本不对,导致飞控的PWM输出时序全乱了。后来排查了两天才发现是编译器优化选项的问题。所以,版本稳定真的很重要。
3.7 本章知识体系
下面这张图帮你理清这一节的核心逻辑:
这一节的内容其实就三件事:下载、安装配置、验证。每一步都不难,但每一步都有细节。我建议你跟着做一遍,遇到问题别慌,对照上面的常见问题排查一下。
我的习惯:装好之后,我会写一个简单的测试脚本,每次打开新终端时自动检查编译器是否可用。这样能避免在编译飞控代码时才发现工具链没配好,浪费时间。
好了,ARM交叉编译器就装好了。下一节我们用它来编译飞控中间件的核心模块。
公众号:蓝海资料掘金营,微信deep3321