2、工具链安装:下载与安装交叉编译工具链(ARM GCC为例)、配置环境变量、验证工具链
好,咱们正式开始动手了。
上一章聊了什么是交叉编译,说白了就是「在PC上编译,在ARM板上运行」。那怎么让PC拥有这个能力?答案就是——装一套交叉编译工具链。
我刚开始学嵌入式那会儿,最头疼的就是装工具链。网上教程五花八门,有的让你从源码编译,有的让你下载几百兆的包,还有的让你用包管理器一键安装。到底哪个靠谱?
嗯,今天我就以ARM GCC为例,带你走一遍最稳的流程。这套方法我在好几个项目里验证过,基本不会踩坑。
2.1 工具链是什么?
先简单说下概念。交叉编译工具链,就是一套能在你的开发机上运行、但生成的是目标平台(比如ARM)可执行文件的工具集合。
它通常包含:
- 编译器:把C/C++代码变成汇编(比如 arm-none-eabi-gcc)
- 汇编器:把汇编变成机器码(arm-none-eabi-as)
- 链接器:把多个目标文件链接成可执行文件(arm-none-eabi-ld)
- 调试器:用于调试目标板上的程序(arm-none-eabi-gdb)
- 库文件:比如C标准库的ARM版本(newlib)
说白了,就是一套「ARM专属的编译全家桶」。
关键点:工具链的命名通常带有目标架构信息。比如 arm-none-eabi-gcc 表示:
- arm:目标架构是ARM
- none:没有操作系统(裸机)
- eabi:嵌入式应用二进制接口
如果你跑的是Linux系统,可能会看到 arm-linux-gnueabihf-gcc,那个是带操作系统的版本。
2.2 下载ARM GCC工具链
我个人习惯从ARM官方或者GNU Arm Embedded Toolchain官网下载。别去第三方网站乱下,我曾经吃过一次亏——下到一个被篡改的版本,编译出来的程序跑起来就崩,查了两天才发现是工具链的问题。
目前最常用的版本是:
- GNU Arm Embedded Toolchain(ARM官方维护)
- 版本号:10.3-2021.10 或更新
- 支持Windows/Linux/macOS
下载地址(别直接点,自己搜一下):
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm
进去之后,找到对应你操作系统的版本:
- Windows:下载 .exe 安装包
- Linux:下载 .tar.bz2 压缩包
- macOS:下载 .pkg 或 .tar.bz2
小技巧:Linux用户建议下载 gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 这个包。别下错了架构,x86_64是给64位PC用的。
2.3 安装工具链
2.3.1 Linux下的安装
Linux下安装其实很简单,解压就行。我一般放在 /opt 目录下:
# 创建目录
sudo mkdir -p /opt/arm-gcc
# 解压到指定目录
sudo tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /opt/arm-gcc
# 查看解压后的内容
ls /opt/arm-gcc/gcc-arm-none-eabi-10.3-2021.10/
解压后你会看到类似这样的目录结构:
gcc-arm-none-eabi-10.3-2021.10/
├── arm-none-eabi/
├── bin/
├── lib/
├── share/
└── ...
bin/ 目录里就是咱们需要的工具,比如 arm-none-eabi-gcc。
2.3.2 Windows下的安装
Windows用户直接双击 .exe 文件,一路Next就行。安装路径建议不要有中文和空格,比如 C:\ARM_GCC。
安装完成后,在开始菜单里能找到「GNU Arm Embedded Toolchain」的文件夹。
2.4 配置环境变量
装好了不代表能用。你得让系统知道「哦,这些工具在哪儿」。这就是环境变量的作用。
2.4.1 Linux配置
我习惯把工具链路径加到 ~/.bashrc 里,这样每次打开终端都能用:
# 编辑 .bashrc
vim ~/.bashrc
# 在文件末尾添加
export PATH=$PATH:/opt/arm-gcc/gcc-arm-none-eabi-10.3-2021.10/bin
# 保存退出后,使配置生效
source ~/.bashrc
如果你用的是zsh,就改 ~/.zshrc,道理一样。
注意:路径一定要写对。我曾经帮一个同事排查问题,他写成了 /opt/arm-gcc/bin,但实际路径里还有一层版本号目录。结果折腾了半小时。
2.4.2 Windows配置
Windows下配置环境变量稍微麻烦点,但也不难:
- 右键「此电脑」→「属性」→「高级系统设置」
- 点击「环境变量」
- 在「系统变量」中找到
Path,双击编辑 - 点击「新建」,输入你的安装路径,比如
C:\ARM_GCC\bin - 确定保存
配置完后,最好重启一下终端或者电脑,确保环境变量生效。
2.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.
如果提示「命令未找到」,那就说明环境变量没配好,或者路径写错了。
我一般还会多验证几个工具:
arm-none-eabi-gcc --version
arm-none-eabi-as --version
arm-none-eabi-ld --version
arm-none-eabi-objdump --version
arm-none-eabi-size --version
这些工具都是日常开发常用的,最好都确认一下。
2.6 写个简单程序测试一下
光看版本号还不够,咱们得真刀真枪编译一个程序试试。
新建一个文件 test.c:
#include <stdio.h>
int main(void)
{
printf("Hello, ARM World!\n");
return 0;
}
然后编译:
arm-none-eabi-gcc -c test.c -o test.o
这条命令的意思是:只编译不链接,生成目标文件 test.o。
如果没报错,说明编译器能正常工作。你可以用 file 命令看看生成的文件是什么架构:
file test.o
输出应该是:
test.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
看到 ARM 两个字了吗?这就对了。你是在x86的电脑上,生成了ARM的机器码——这就是交叉编译。
重要提醒:这个 test.o 不能在PC上直接运行!它是ARM格式的。如果你想在PC上模拟运行,需要装QEMU。不过那是后面章节的内容了。
2.7 常见问题与避坑
我这些年遇到过不少工具链相关的问题,挑几个典型的说说:
- 版本不匹配:有些老项目只能用特定版本的工具链。比如STM32F1系列,用gcc 4.9和gcc 10编译出来的代码,行为可能不一样。我建议项目一开始就锁定工具链版本,用文档记下来。
- 路径有空格:Windows用户尤其要注意。安装路径里如果有空格,某些makefile会解析出错。老老实实把工具链装到
C:\ARM_GCC这种路径下。 - 32位 vs 64位:Linux下如果下载了32位的工具链,但系统是64位的,可能会缺32位库。报错信息通常是
No such file or directory。解决办法:安装32位兼容库,或者直接下载64位版本。 - 权限问题:Linux下解压到
/opt需要sudo权限。如果不想用sudo,可以解压到自己的home目录下,比如~/tools/arm-gcc。
2.8 本章知识体系
下面这张图帮你理清工具链安装的整个流程:
2.9 小结
好了,这一章的内容就这些。总结一下:
- 工具链是一套编译工具集合,包含编译器、汇编器、链接器等
- 从ARM官方下载GNU Arm Embedded Toolchain
- Linux下解压到
/opt,Windows下运行安装程序 - 配置环境变量,让系统能找到工具链
- 用
--version验证安装,用file命令确认生成的是ARM架构代码
工具链装好了,咱们就有了「武器」。下一章开始,我会带你用Makefile把这些工具串起来,实现真正的自动化编译。到时候你会发现,手动敲命令的日子一去不复返了。
公众号:蓝海资料掘金营,微信deep3321