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下配置环境变量稍微麻烦点,但也不难:

  1. 右键「此电脑」→「属性」→「高级系统设置」
  2. 点击「环境变量」
  3. 在「系统变量」中找到 Path,双击编辑
  4. 点击「新建」,输入你的安装路径,比如 C:\ARM_GCC\bin
  5. 确定保存

配置完后,最好重启一下终端或者电脑,确保环境变量生效。

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 本章知识体系

下面这张图帮你理清工具链安装的整个流程:

工具链安装流程 第一步:下载 ARM官方下载 选择对应OS版本 第二步:安装 Linux: 解压到 /opt Windows: 运行安装程序 第三步:配置环境变量 Linux: 修改 .bashrc Windows: 修改 Path 第四步:验证 arm-none-eabi-gcc --version 第五步:测试编译 arm-none-eabi-gcc -c test.c -o test.o 验证通过后,即可开始交叉编译开发

2.9 小结

好了,这一章的内容就这些。总结一下:

  • 工具链是一套编译工具集合,包含编译器、汇编器、链接器等
  • 从ARM官方下载GNU Arm Embedded Toolchain
  • Linux下解压到 /opt,Windows下运行安装程序
  • 配置环境变量,让系统能找到工具链
  • --version 验证安装,用 file 命令确认生成的是ARM架构代码

工具链装好了,咱们就有了「武器」。下一章开始,我会带你用Makefile把这些工具串起来,实现真正的自动化编译。到时候你会发现,手动敲命令的日子一去不复返了。


公众号:蓝海资料掘金营,微信deep3321