安装 arm-none-eabi-gcc 工具链 📅 发布时间:2026/8/27 11:10:02 👁 浏览次数: 安装 arm-none-eabi-gcc 工具链一行命令安装安装 arm-none-eabi-gcc 工具链本课目标一行命令安装完整 ARM GCC 工具链这个包装了哪些东西——不只是 gcc 一个文件本页大纲一行命令安装 一行命令——安装 ARM 工具链的全部 包名逐段拆解——看懂 MSYS2 的命名规则 一次安装得到四个子包️ 打开正确的终端——MSYS2 有四个入口 安装时的交互提示——pacman 会问你什么 装完之后的文件都去哪了——ucrt64 目录结构 安装后的第一件事——五连验证 快照备份❓ 安装 FAQ——新手最常问的 5 个问题️ 装完 gcc 之后——本系列接下来的工具清单PATH深度解析PATH 为何对工具链至关重要PATH 搜索机制图解PATH 的三层配置——从终端到 VSCode 到脚本本页大纲PATH 深度解析 装完 gcc 之后——为什么还要管 PATH⚙️ 把 ucr64/bin 加入系统 PATH——图形界面三步走✅ 验证which gcc 一锤定音 PATH 的三层叠加——为什么 VSCode 里 PATH 和终端不一样✅ 系统 PATH vs 用户 PATH——到底该加哪个️ 命令行改 PATH——不依赖图形界面 PATH 常见误区——五句话千万别信 终极测试从 VSCode 里编译——提前预习第 37 课️ 快速自检——PATH 相关五连问版本选择与配套GCC 版本选择——arm-none-eabi-gcc 的版本演进Cortex-M 开发中的 GCC 版本推荐不同版本之间代码兼容吗安装同时还需要CMake Ninja GDB本页大纲版本选择与配套 GCC 16.1 版本解析——为什么是它 GCC 版本与 Cortex-M 内核的兼容矩阵 升级与回退——pacman 的版本管理 GCC 版本发展史——为什么新不总是好 同一段代码不同 GCC 的编译差异——你知道会发生什么吗 版本记录模板——为可复现构建留档 版本与可复现构建——为什么版本号要写进 CI GCC 16.1 对 LKS32 项目的实测表现——本系列的数据来源 升级实战——从旧版本平滑迁移到 GCC 16.1 版本速查表——常用命令一句话记忆验证与排错安装后验证与常见排错三步验证终极测试编译一个最简单的 ARM 程序最后一步编译 LKS32 项目确认常见安装问题速查本页大纲验证与排错 安装验证——四连命令确认工具链可用 终极验证——编译第一个 ARM 程序 六大常见错误速查表️ 用 objdump 深度验证——看编译产物内部 交叉 GCC vs 本机 GCC——两个 gcc 的世纪对比 安装核对单——装完逐项打勾 第 06 课知识地图——安装工具的完整心智模型 本课毕业标准——看完这页你该带走什么 第 06 课与前后的衔接——你在整个系列的位置一行命令安装安装 arm-none-eabi-gcc 工具链arm-none-eabi-gcc 是嵌入式 ARM 开发的核心工具链——用来编译 C/ASM 代码生成 ARM Cortex-M 处理器能执行的机器码。通过 MSYS2 的 pacman 安装一行命令搞定全部。本课目标学会用 pacman 安装 arm-none-eabi-gcc 完整工具链理解包名格式mingw-w64-ucrt-x86_64-arm-none-eabi-gcc 的含义掌握 PATH 为什么对工具链至关重要安装后如何验证工具链一切正常一行命令安装完整 ARM GCC 工具链这个包名很长——拆解一下部分含义mingw-w64-ucrt-x86_64在 Windows UCRT64 环境下运行的 64 位程序这是宿主机的编译器本体arm-none-eabi-gcc这个编译器用来生成 ARM 裸机程序目标架构 ARM目标 OS 无ABI 嵌入式 包名拆解关键理解前半段描述的是编译器本身在什么平台上跑Windows 64位后半段描述的是编译器生成什么平台的代码ARM 裸机。这就是交叉编译器的本质——一个在 x86 上运行但生成 ARM 机器码的程序。这个包装了哪些东西——不只是 gcc 一个文件mingw-w64-ucrt-x86_64-arm-none-eabi-gcc这个包本质上是一个元包meta-package——它依赖并自动安装整套 ARM 工具链子包自动安装包含的文件用途arm-none-eabi-binutilsld, as, objcopy, size, nm, objdump链接器 汇编器 二进制工具arm-none-eabi-gccarm-none-eabi-gcc, gC/C 编译器arm-none-eabi-newliblibc.a, libm.a, libg.anewlib 标准 C 库嵌入式精简版arm-none-eabi-gdbgdb-multiarchGDB 调试器第 11 阶段会深入讲解本页大纲一行命令安装① 完整的安装命令 → ② 包名逐段拆解 → ③ 安装过程全流程 → ④ 交互安装模拟 → ⑤ 四大子包说明 → ⑥ 安装后验证 一行命令——安装 ARM 工具链的全部打开MSYS2 UCRT64 终端不是 MSYS2 MSYS粘贴这一行$ pacman -S mingw-w64-ucrt-x86_64-arm-none-eabi-gcc 三个易错点① 必须是UCRT64 终端开始菜单里选 “MSYS2 UCRT64”不是 “MSYS2 MSYS”② 包名前缀mingw-w64-ucrt-x86_64-一个字符都不能少③ 不要用 sudoMSYS2 不需要。 包名逐段拆解——看懂 MSYS2 的命名规则 一次安装得到四个子包arm-none-eabi-gcc是一个元包meta-package——它会自动安装配套的 4 个核心组件#子包用途1arm-none-eabi-gccC 编译器本体gcc 命令——核心中的核心2arm-none-eabi-binutils汇编器 链接器 objcopy/size/objdump第 05 课讲过家族3arm-none-eabi-newlib嵌入式 C 标准库printf/memcpy 等——nano.specs 用它4arm-none-eabi-gdbARM 调试器也可单独用 gdb-multiarch 为什么是一体的这四个组件必须版本匹配才能协同工作——元包机制保证它们永远一起升级绝不出现编译器 v16 配 binutils v12的诡异组合。 一句话总览安装的本质 一条命令 一个正确的包名。包名记不住没关系——记住mingw-w64-ucrt-x86_64-前缀 工具名用 pacman -Ss 也能搜到。️ 打开正确的终端——MSYS2 有四个入口开始菜单里 MSYS2 文件夹有多个终端入口选错会导致装错环境入口环境适合本课选择MSYS2 UCRT64UCRT64最新 CRT现代嵌入式开发✅ 就用它MSYS2 MINGW64MINGW64MSVCRT老项目兼容不用MSYS2 MSYSMSYS自研 CRT构建 MSYS2 自身不用MSYS2 CLANG64Clang 工具链Clang 生态不用 选错终端的后果如果在 MSYS2 MSYS 终端里执行安装命令会装到msys 环境而不是 ucr64——gcc 会出现在 C:\msys64\usr\bin 而不是 ucrt64\binPATH 全乱。装之前先看终端标题栏写着 “UCRT64”。 安装时的交互提示——pacman 会问你什么$ pacman -S mingw-w64-ucrt-x86_64-arm-none-eabi-gcc :: 正在解析依赖关系... :: 正在查找软件包冲突... 软件包 (4) mingw-w64-ucrt-x86_64-arm-none-eabi-gcc-16.1.0-1 mingw-w64-ucrt-x86_64-arm-none-eabi-binutils-2.44-1 mingw-w64-ucrt-x86_64-arm-none-eabi-newlib-4.5.0-1 mingw-w64-ucrt-x86_64-arm-none-eabi-gdb-15.2-1 安装大小98.50 MiB :: 是否继续安装 [Y/n] y ← 输入 y 回车 :: 正在下载软件包... ← 此处看网速第 08 课镜像加速 :: 正在安装... 完成 看懂这四行①解析依赖元包自动带 4 个子包→ ②下载大小 98.5 MiB默认源可能很慢→ ③[Y/n] 确认输入 y→ ④安装完成。全程 1 分钟镜像加速后。 装完之后的文件都去哪了——ucrt64 目录结构C:\msys64\ucrt64\ ├── bin\ │ ├── arm-none-eabi-gcc.exe ← 编译器 │ ├── arm-none-eabi-objcopy.exe ← 格式转换 │ ├── arm-none-eabi-size.exe ← 大小报告 │ ├── arm-none-eabi-gdb.exe ← 调试器 │ └── arm-none-eabi-objdump.exe ← 反汇编 ├── lib\gcc\arm-none-eabi\16.1.0\ ← GCC 内部库 ├── arm-none-eabi\include\ ← 标准头文件newlib └── arm-none-eabi\lib\ ← 标准库 知道这些有什么用排错时需要① 确认 gcc.exe 存在装没装→ ② 确认 bin 在 PATH找不找得到→ ③ 确认 include 存在头文件在不在——三步定位 90% 的安装问题。 安装后的第一件事——五连验证 快照备份$ which arm-none-eabi-gcc objcopy size gdb /c/msys64/ucrt64/bin/arm-none-eabi-gcc.exe /c/msys64/ucrt64/bin/arm-none-eabi-objcopy.exe /c/msys64/ucrt64/bin/arm-none-eabi-size.exe /c/msys64/ucrt64/bin/arm-none-eabi-gdb.exe ← 全在 ucr64/bin ✅ $ pacman -Q | grep arm-none-eabi mingw-w64-ucrt-x86_64-arm-none-eabi-binutils 2.44-1 mingw-w64-ucrt-x86_64-arm-none-eabi-gcc 16.1.0-1 mingw-w64-ucrt-x86_64-arm-none-eabi-gdb 15.2-1 mingw-w64-ucrt-x86_64-arm-none-eabi-newlib 4.5.0-1 # 快照把已装包列表导出换机器一键还原第 05 课讲过 $ pacman -Q ~/msys2-packages.txt 验证标准四个命令全部指向 ucr64/bin 四个子包齐全 安装完美收官。顺手导出快照以后换电脑 30 秒还原。❓ 安装 FAQ——新手最常问的 5 个问题问题答案需要装到特定目录吗不需要——pacman 自动装到 C:\msys64\ucrt64目录结构是标准的需要配置环境变量 GCC_HOME 吗不需要——现代工具靠 PATH 找工具不靠环境变量arm-none-eabi-gcc 和 gcc-arm-none-eabi 一样吗同一工具不同包名MSYS2 用前者apt 用后者效果一样可以装两个版本共存吗可以但麻烦——MSYS2 默认只维护一个版本要用旧版需自己处理装错环境装了 MINGW64 版怎么办pacman -R 卸载再到 UCRT64 终端重装️ 装完 gcc 之后——本系列接下来的工具清单#工具安装命令对应课程状态1arm-none-eabi-gccpacman -S …-arm-none-eabi-gcc第 06 课✅ 本课2CMakepacman -S …-cmake第 07 课⏳ 下一课3Ninjapacman -S …-ninja第 07 课⏳ 下一课4gdb-multiarchpacman -S …-gdb-multiarch第 41 课⏳ 稍后5J-LinkSEGGER 官网下载第 42 课⏳ 稍后6VSCode 扩展vscode 市场安装第 36 课⏳ 稍后 进度感六件工具你已完成第 1 件1/6。接下来第 07 课一次装 2 件CMake Ninja——装完这三件你就能跑通完整的命令行构建了。继续加油 本课记忆锚点安装工具链 一条 pacman 命令 PATH 配置 版本认知。记住三个数字98.5 MiB下载大小、4子包数量、C:\msys64\ucrt64\bin工具目录——以后装任何工具都是同一套路。PATH深度解析PATH 为何对工具链至关重要装完不等于能用——Windows 需要知道去哪里找 arm-none-eabi-gcc.exe。PATH 环境变量就是那个地址簿。PATH 搜索机制图解PATH 的三层配置——从终端到 VSCode 到脚本层级配置位置作用第1层UCRT64 终端启动脚本终端内自动注入——你在终端敲 arm-none-eabi-gcc 就能用第2层.vscode/settings.jsonVSCode 内 CMake Tools 才能找到——最关键的一层第3层build.sh / build.cmd 脚本命令行脚本独立运行时也能找到{ cmake.environment : { PATH : C:/msys64/ucrt64/bin;${env:PATH} } } 如果 PATH 配错VSCode 中 CMake configure 时报 arm-none-eabi-gcc not found - 检查 settings.json 的 cmake.environment.PATH 是否包含 C:/msys64/ucrt64/bin。这是 90% 的配置问题根源。本页大纲PATH 深度解析① 为什么装完还要配 PATH → ② 安装后 PATH 自动变化 → ③ 三场景配置终端/VSCode/脚本→ ④ 交互PATH 前后对比 → ⑤ 验证 which gcc 装完 gcc 之后——为什么还要管 PATHpacman 把 gcc.exe 装到了C:\msys64\ucrt64\bin。但 Windows 不知道这个目录存在——除非它出现在 PATH 里。好消息MSYS2 的 UCRT64 终端启动时会自动把 ucr64/bin 加入 PATH所以在 MSYS2 终端里直接能用。但普通 cmd / VSCode 不一定。⚙️ 把 ucr64/bin 加入系统 PATH——图形界面三步走 为什么改了没生效90% 是因为没有重启终端——环境变量只在进程启动时读取一次。VSCode 要完全退出不是关窗口cmd 要新开窗口。✅ 验证which gcc 一锤定音$ which gcc /c/msys64/ucrt64/bin/gcc.exe ← ✅ 正确指向 ucr64/bin $ gcc --version gcc.exe (GNU Toolchain for the Arm Architecture 16.1) 16.1.0 Copyright (C) 2025 Free Software Foundation, Inc. 本页小结PATH 配置的本质告诉 Windowsgcc 住在哪。配置一次终身受益——以后每次安装新工具cmake/ninja/gdb它们都会自动出现在同一个 ucr64/bin 里PATH 不用再改。 PATH 的三层叠加——为什么 VSCode 里 PATH 和终端不一样很多人困惑我在 cmd 里能用 gccVSCode 里怎么不行答案是** PATH 是多层叠加的**✅ 系统 PATH vs 用户 PATH——到底该加哪个对比系统 PATH用户 PATH生效范围所有用户仅当前用户需要管理员是否推荐场景CI 服务器、共享机器个人开发机本教程建议—✅ 加到用户 PATH 为什么加用户 PATH个人电脑上用户 PATH 足够不需要管理员权限也不影响其他用户——干净又安全。️ 命令行改 PATH——不依赖图形界面# 读取当前用户 PATH $oldPath [Environment]::GetEnvironmentVariable(Path, User) # 追加 ucr64/bin若已存在则不重复 if ($oldPath -notlike *ucrt64*bin*) { [Environment]::SetEnvironmentVariable( Path, $oldPath ;C:\msys64\ucrt64\bin, User) } # 完成后重开终端 → which gcc 验证 本页小结PATH 的完整心智模型三层叠加系统用户应用内 修改需重启 用 which 验证。掌握这三点PATH 相关的问题在你手里都不超过 1 分钟。 PATH 常见误区——五句话千万别信误区真相“装完 gcc 就能用了”只在 MSYS2 UCRT64 终端能用cmd/VSCode 需要 PATH“PATH 配一次管所有”对一半——应用内注入settings.json是另一层第 37 课“重启电脑才生效”过度——重开终端就生效VSCode 完全退出即可“两个 PATH 目录都有 gcc 没事”有事——顺序即优先级可能用错版本“which 能查到就行”还要确认 which 指向的是 ucr64/bin而不是别的目录 PATH 排错三步曲①which gcc看找到没 → ②echo $PATH看有没有 ucr64/bin → ③重开终端再试。三步走完 90% 的问题解决。 终极测试从 VSCode 里编译——提前预习第 37 课# 在 VSCode 里按 Ctrl 打开集成终端 $ which gcc /c/msys64/ucrt64/bin/gcc.exe ← ✅ 说明 PATH 全局生效 若找不到 → 完全退出 VSCode 重启️ 快速自检——PATH 相关五连问#问题答案1gcc.exe 装在哪C:\msys64\ucrt64\bin2怎么让 cmd 也能用 gcc把 ucr64/bin 加入系统/用户 PATH3改完 PATH 要重启什么重开终端VSCode 完全退出4怎么确认生效which gcc 指向 ucr64/bin5VSCode 里找不到怎么办settings.json 注入第 37 课 经验之谈新手的 PATH 之痛本质是*“以为装完就能用的预期落差*。提前做好心理建设装完 → 配 PATH → 重启终端 → which 验证四步走完才是真的装好了”。这套流程适用于所有命令行工具。版本选择与配套GCC 版本选择——arm-none-eabi-gcc 的版本演进MSYS2 提供了多个版本。LKS32 项目推荐使用最新稳定版GCC 16.1.0同时保持对旧版本的兼容性理解。Cortex-M 开发中的 GCC 版本推荐GCC 版本发布时间说明16.1.02025LKS32 项目使用的版本——最新稳定版Bug 修复最全代码生成质量最好14.2.02024更多企业项目的选择——版本稳定与 13.x 差异不大13.2.02023CI/CD 常用版本GitHub Actions 的 arm-none-eabi-gcc-action 默认版本不同版本之间代码兼容吗理论上 arm-none-eabi-gcc 的所有版本都支持相同的一套编译选项-mcpu, -mthumb 等。但实际上差异点说明代码生成质量新版本通常生成更小的代码——LKS32 只有 32KB Flash每一字节都重要警告更严格新版本可能对以前没报错的代码产生新警告-Wall 覆盖范围扩大Bug 修复新版本修复了旧版本中 ARM 相关的编译器 Bug虽然很少见 实践建议本地开发用 MSYS2 的最新版16.1.0。CI 上可以锁定版本如 13.2.0以保证可复现性。最终 .hex 用 CI 确认过的版本产出。安装同时还需要CMake Ninja GDBGCC编译器 CMake构建生成器 Ninja执行编译 GDB调试器——四个工具一行命令。本页大纲版本选择与配套① 为什么是 GCC 16.1 → ② 版本选择的三个原则 → ③ GCC 版本 vs Cortex-M 内核 → ④ 交互版本对比 → ⑤ 升级与回退 GCC 16.1 版本解析——为什么是它MSYS2 仓库当前提供GCC 16.1.0ARM Embedded 版。版本号三段式16主版本· 1次版本· 0修订。选择原则很简单用仓库里最新的稳定版不要追 beta不要用古董版。 GCC 版本与 Cortex-M 内核的兼容矩阵Cortex-M 内核GCC 支持LKS32 使用说明M0 / M0所有版本 ✅✅ LKS32MC033最简单的内核兼容性最好M3所有版本 ✅—STM32F1 系列M4所有版本 ✅—STM32F4 系列含 FPUM7需较新版本—新指令需要 GCC 9M33需较新版本—TrustZone 需要 GCC 10 结论对 Cortex-M0你的 LKS32MC033任何 GCC 版本都能编——GCC 16.1 完全没有兼容风险。选择自由度最高。 升级与回退——pacman 的版本管理# 查看已安装版本 $ pacman -Q arm-none-eabi-gcc arm-none-eabi-gcc 16.1.0-1 # 升级到最新 $ pacman -Syu :: 同步软件包数据库... 完成 # 搜索可用版本 $ pacman -Ss arm-none-eabi-gcc mingw-w64-ucrt-x86_64-arm-none-eabi-gcc 16.1.0-1 本页小结版本不是玄学稳定 兼容 记录三原则配合 pacman 的 -Q/-Syu/-Ss 三命令版本管理完全可控。对 M0 芯片更是随便装都不怕。 GCC 版本发展史——为什么新不总是好 核心原则对新项目用最新稳定版对老项目别人写的工程先用工程自带的版本跑通再考虑升级。升级永远要回归测试。 同一段代码不同 GCC 的编译差异——你知道会发生什么吗// 场景 1__attribute__((always_inline)) // 所有版本都支持 —— 无差异 // 场景 2-Wshadow 警告第 24 课 // GCC 11 对函数内同名变量提示更准确 // 场景 3LTO 行为第 23 课 // 新版 LTO 跨文件优化更激进可能暴露更多问题 // 场景 4未初始化变量 // 新版 GCC 可能多出 -Wmaybe-uninitialized 警告 // 老版不报 —— 升级后警告变多别慌是编译器更严格 版本记录模板——为可复现构建留档# 工具链版本可复现构建依据 | 工具 | 版本 | 安装方式 | |------|------|---------| | arm-none-eabi-gcc | 16.1.0 | pacman -S mingw-w64-ucrt-x86_64-arm-none-eabi-gcc | | CMake | 4.4.0 | pacman -S mingw-w64-ucrt-x86_64-cmake | | Ninja | 1.13.2 | pacman -S mingw-w64-ucrt-x86_64-ninja | | gdb-multiarch | 17.2 | pacman -S mingw-w64-ucrt-x86_64-gdb-multiarch | | J-Link | 7.68 | SEGGER 官网 | 本页小结版本管理的终极目标任何人、任何机器、任何时间都能用相同版本重现完全相同的固件第 03 课的位级可复现。README 里记下版本就是可复现的地基。 版本与可复现构建——为什么版本号要写进 CI GCC 16.1 对 LKS32 项目的实测表现——本系列的数据来源指标GCC 16.1 实测说明Flash 占用-Og1,280 B第 23 课四档优化实测Flash 占用-Os1,120 B最小体积档编译耗时全量约 2 秒Ninja 并行第 07 课警告数-Wall -Wextra0代码干净第 24 课 这些数字从哪来全部来自 LKS32_Cmake 项目的真实编译输出——你跟着本系列走会亲手复现这些数字。这就是课程内容来自真实项目的底气。 升级实战——从旧版本平滑迁移到 GCC 16.1如果你的项目之前用 GCC 10/12升到 16.1 时有三个升级动作要做# ① 更新系统 工具链 $ pacman -Syu $ pacman -S mingw-w64-ucrt-x86_64-arm-none-eabi-gcc # ② 验证版本 $ arm-none-eabi-gcc --version | head -1 gcc.exe (GNU Toolchain for the Arm Architecture 16.1) 16.1.0 # ③ 全量重编清缓存避免旧 .o 混入 $ rm -rf build cmake --preset debug cmake --build --preset debug # ④ 对比 Flash/RAM 占用与旧版 $ arm-none-eabi-size build/debug/*.elf 升级后可能的变化① 新警告变多编译器更严格→ 逐个修复② Flash 占用可能变小优化更好→ 对比记录③ 汇编文件语法错误少见→ 按新版语法修正。升级三步走验证 → 全量重编 → 回归对比。 版本速查表——常用命令一句话记忆命令作用pacman -Q 包名查看已装包的版本pacman -Ss 关键词搜索仓库里的包pacman -Syu同步数据库 全量升级pacman -S 包名安装指定包pacman -R 包名卸载包gcc --version查看编译器版本gcc -v查看编译配置含 Target 版本焦虑排解网上教程可能提到 GCC 13/14/15——别慌对 Cortex-M0 来说任何现代 GCC 都能编。本教程统一用 16.1MSYS2 当前仓库版本你只需要版本一致这一个要求数字本身不重要。验证与排错安装后验证与常见排错装完所有工具后——必须逐项验证在出问题之前搞定。三步验证终极测试编译一个最简单的 ARM 程序最后一步编译 LKS32 项目确认看到这个输出——你的开发环境完全正常可以开始正式开发了。常见安装问题速查问题排查步骤arm-none-eabi-gcc: command not found1. 确认在 UCRT64 终端中运行非 MSYS2 终端、非 CMD 2. echo $PATH 确认含 /ucrt64/bin 3. pacman -S … 确认已安装CMake: arm-none-eabi-gcc not found1. 检查 .vscode/settings.json - cmake.environment.PATH 2. 确保路径为 C:/msys64/ucrt64/bin 3. 如果有 ncs 环境冲突——移除冲突的 PATH 条目pacman 下载速度极慢1. 编辑 C:\msys64\etc\pacman.d\mirrorlist.* 2. 把清华/中科大源排在最前面 3. pacman -Syu 刷新-mcpucortex-m0 报 unknown CPU确认安装的是 arm-none-eabi-gcc 而非 x86_64 GCC——which arm-none-eabi-gcc 输出应为 /ucrt64/bin/ 下一课预告装完 GCC 后下一课来装 CMake 与 Ninja——构建系统的核心引擎。理解它们怎么配合 GCC 完成cmake --preset debug - cmake --build的全流程。本页大纲验证与排错① 完整验证流程 → ② 编译第一个 ARM 程序 → ③ 交互排错演练 → ④ 六大常见错误速查 → ⑤ 下一步预告 安装验证——四连命令确认工具链可用$ arm-none-eabi-gcc --version gcc.exe (GNU Toolchain for the Arm Architecture 16.1) 16.1.0 Copyright (C) 2025 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 -v Using built-in specs. COLLECT_GCCarm-none-eabi-gcc Target: arm-none-eabi ← 目标平台是 ARM 验收标准看到 Target: arm-none-eabi 交叉编译器安装成功。注意对比本机 GCC 显示 Target: x86_64-w64-mingw32——两者完全不同别搞混。 终极验证——编译第一个 ARM 程序理论验证–version通过后用真实编译测试工具链的完整链路# 1. 创建源文件 $ echo int main(){return 0;} hello.c # 2. 交叉编译-mcpucortex-m0 指定内核 $ arm-none-eabi-gcc -mcpucortex-m0 -mthumb -c hello.c -o hello.o # 3. 确认产物是 ARM 格式 $ file hello.o hello.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV) ^^^^ ARM 确认交叉编译链路完整 里程碑达成如果你看到了 ARM, EABI5——恭喜你的 Windows 已经能产出 ARM 机器码了。这是 LKS32 开发旅程的第一块里程碑。接下来第 07 课装 CMake 和 Ninja第 19 课解释 -mcpu 的每个字符。 六大常见错误速查表#报错根因解决1package not found包名拼错 / 用了 MINGW64 前缀核对 mingw-w64-ucrt-x86_64- 前缀2‘arm-none-eabi-gcc’ 不是命令PATH 没有 ucr64/bin配 PATH 重启终端Tab 23找不到 stdio.hnewlib 未装 / include 路径缺失重装 arm-none-eabi-gcc 元包4Target 显示 x86_64调用了本机 gcc 而非交叉 gcc用全名 arm-none-eabi-gcc5权限不足MSYS2 装在受保护目录以普通用户运行 MSYS2勿用管理员6下载超时镜像源慢第 08 课切国内镜像 下一课预告第 07 课编译器装好了但只有编译器还不够——下一课安装 CMake 与 Ninja为什么 CMake ≥ 3.20、Ninja 比 Make 快在哪、configure→build 三步流程——装完这套你就能跑通完整的 CMake 构建了。️ 用 objdump 深度验证——看编译产物内部file 验证了是 ARM 格式objdump 能进一步验证指令真的是 Cortex-M0 的$ arm-none-eabi-objdump -d hello.o hello.o: file format elf32-littlearm Disassembly of section .text: 00000000 : 0: b580 push {lr} ← Thumb 指令16 位 2: 2000 movs r0, #0 ← Cortex-M0 支持 4: bd80 pop {pc} 6: 4770 bx lr ← 返回调用者 看懂这段反汇编①b580/bd80/4770都是 16 位 Thumb 指令Cortex-M0 只有 Thumb没有 ARM 32 位指令→ ②movs r0,#0就是 return 0 → ③ 全部指令 Cortex-M0 都支持 -mcpucortex-m0 生效。第 45-46 课会教用 objdump 定位 HardFault。 交叉 GCC vs 本机 GCC——两个 gcc 的世纪对比对比arm-none-eabi-gccgcc本机Targetarm-none-eabiARM 裸机x86_64-w64-mingw32PC产物ARM 机器码烧进芯片x86 机器码在 PC 运行头文件newlib嵌入式库MSVCRT/UCRTPC 库用途编译固件编译 PC 工具误用后果—编译出的 .elf 烧进芯片直接跑飞 防呆技巧永远用全名 arm-none-eabi-gcc 而不是 gcc——在交叉编译工程里裸写 gcc 是新手第一大坑会把 ARM 固件编译成本机程序。第 19 课详解交叉编译原理。 安装核对单——装完逐项打勾#检查项命令预期结果1UCRT64 终端正确看标题栏写着 “UCRT64”2gcc 已安装pacman -Q arm-none-eabi-gcc16.1.0-13PATH 正确which gcc/c/msys64/ucrt64/bin/gcc.exe4版本正确gcc --versionTarget: arm-none-eabi5编译链路通编译 hello.c fileARM, EABI56指令集对objdump -d hello.oThumb 16 位指令 第 06 课收官六项全过 交叉编译环境彻底就绪。下一步第 07 课装 CMake 和 Ninja——装完就能体验cmake 一行配置、ninja 秒级编译的现代构建快感了。 第 06 课知识地图——安装工具的完整心智模型 本课毕业标准——看完这页你该带走什么能力验收方式独立安装工具链不查资料能敲出完整 pacman 安装命令解释包名结构能拆解 mingw-w64-ucrt-x86_64- 四段含义配置 PATH能让 cmd/VSCode/MSYS2 三种终端都找到 gcc验证交叉编译file 输出确认 ARM, EABI5objdump 确认 Thumb版本管理会 pacman -Q/-Syu/-Ss 三命令 快照导出 第 06 课收官五个能力全过 你已经是一位装环境不求人的嵌入式开发者。下一课第 07 课安装 CMake 与 Ninja——编译器 构建系统 完整的现代构建体验。 第 06 课与前后的衔接——你在整个系列的位置