Keil MDK 5.37+ 手动安装 ARM Compiler 5 完整指南
1. 为什么还要折腾 AC5 编译器如果你最近刚把 Keil MDK 升级到 5.37 或更高版本然后打开一个几年前甚至十年前的 STM32 老工程点击编译大概率会看到一行让人血压升高的报错Cannot find ARM Compiler 5或者更直接的The configured compiler version 5 is not available。这不是你的工程坏了也不是芯片包没装好而是 ARM 从 MDK 5.37 开始默认只捆绑 ARM Compiler 6也就是 AC6基于 Clang/LLVM把老旧的 AC5基于 ARMCC从安装包里彻底拿掉了。问题在于大量存量工程——尤其是 STM32F1/F4 系列的标准外设库工程、GD32 的官方例程、还有一堆国产 MCU 的 SDK——它们的启动文件、分散加载脚本、内联汇编写法都是为 AC5 量身定做的。你硬切到 AC6轻则一堆__asm语法报错重则链接阶段直接找不到符号。所以给 Keil5 MDK 单独补装 AC5 编译器是每一个还在维护老项目的嵌入式工程师绕不过去的一道坎。这篇内容就是把我自己反复装过十几台机器、踩过各种坑之后总结出来的完整流程写清楚。不管你是刚入行的新手还是被 AC6 折磨到想砸键盘的老手跟着走一遍基本都能把 AC5 装回来并让老工程重新跑起来。核心关键词就几个Keil5、MDK、Compiler Version5、ARM Compiler 5、AC5下面全部围绕它们展开。2. 先搞清楚 AC5 和 AC6 到底差在哪2.1 两代编译器的本质区别很多人只知道AC5 老、AC6 新但不知道具体差在哪结果在选型时反复摇摆。我用一张表把关键差异列清楚你一看就明白为什么老工程离不开 AC5。对比维度ARM Compiler 5 (AC5)ARM Compiler 6 (AC6)底层架构基于 ARMCC传统专有编译器基于 Clang/LLVM 开源架构默认 C 标准C90 / 部分 C99C99 / C11内联汇编语法__asm { ... }传统写法GCC 风格asm volatile分散加载文件.sct语法宽松.sct语法更严格对老启动文件兼容完美兼容经常报错编译速度较慢明显更快代码优化优化选项少优化更激进体积更小官方支持状态已停止维护当前主力关键点在于内联汇编和启动文件。STM32 标准库里的core_cm3.h、core_cm4.h用了大量 AC5 风格的__ASM内联汇编AC6 直接不认。你如果强行用 AC6 编译会看到成百上千条错误改到你怀疑人生。所以对于老工程装回 AC5 是最省事、最稳妥的选择。2.2 什么情况下必须用 AC5不是所有工程都需要 AC5我总结了几种典型场景符合任意一条你就老老实实装 AC5工程基于STM32 标准外设库StdPeriph Lib而不是 HAL 库工程里有大量__asm内联汇编尤其是 RTOS 的移植层如 FreeRTOS 的 port 文件工程使用了GD32、华大、灵动等国产 MCU 的官方例程这些例程大多还是 AC5 时代产物工程依赖某些只提供.lib静态库、且该库是 AC5 编译的第三方组件你接手了一个能跑就别动的祖传工程改一行都可能出问题反过来如果是全新项目、用 HAL 库、没有历史包袱那就直接用 AC6没必要往回退。2.3 版本兼容性要提前确认这里有个容易被忽略的细节AC5 的版本号要和你的 MDK 版本匹配。AC5 最后几个版本是 5.06 update 6、update 7。MDK 5.36 及以前自带 AC55.37 之后需要手动装。你下载 AC5 安装包时认准ARM Compiler 5.06 update 7 (build 960)这个版本它是官方最后一个 AC5 版本兼容性最好。注意不要随便找个来路不明的 AC5 压缩包就用版本不对会导致编译出来的代码有隐患甚至链接失败。优先从官方渠道或可信的镜像获取。3. 安装前的准备工作3.1 确认你的 MDK 版本和现状动手之前先打开 Keil点Help - About uVision看清楚你的 MDK 版本号。这一步很重要因为不同版本的处理方式略有差异。如果版本≤ 5.36理论上自带 AC5你只需要在工程里切换编译器版本即可不用重新安装如果版本≥ 5.37AC5 已被移除需要手动补装同时确认一下你的安装路径默认是C:\Keil_v5。记住这个路径后面配置要用。3.2 下载 AC5 安装包AC5 的安装包通常是一个独立的可执行文件名字类似ARMCompiler5.06u7.exe或者是一个包含编译器文件的压缩包。下载完成后先别急着双击把它放到一个没有中文、没有空格的路径下比如D:\tools\AC5。中文路径是嵌入式工具链的老大难问题能避就避。3.3 关闭 Keil 和杀毒软件安装前务必完全退出 Keil包括后台进程。同时临时关闭杀毒软件因为 AC5 安装过程会往系统目录写文件、注册组件某些杀软会误拦截导致安装不完整。装完再打开就行。4. 手把手安装 AC5 编译器4.1 运行安装程序双击 AC5 安装包进入安装向导。第一步是接受许可协议勾选同意后点 Next。接下来会让你选择安装路径这里有个关键决策方案一装到 Keil 安装目录下的 ARM 文件夹路径类似C:\Keil_v5\ARM\ARM_Compiler_5.06u7。这样 Keil 能自动识别配置最省心。方案二装到独立目录比如D:\tools\AC5。这样多个 Keil 版本可以共用但需要手动在 Keil 里指定路径。我个人推荐方案一因为 Keil 对自家目录下的编译器识别最顺畅少一步手动配置就少一个出错点。4.2 安装过程中的选项安装过程中可能会问你是否安装一些附加组件比如 CMSIS、示例代码等。对于只想补编译器的我们来说只勾选编译器核心组件即可其他可以不装减少干扰。安装完成后去你选的目录下看一眼应该能看到bin文件夹里面有armcc.exe、armlink.exe、armar.exe这些关键可执行文件。看到它们说明编译器本体装好了。4.3 在 Keil 中注册编译器路径这一步是很多人卡住的地方。装完 AC5 后Keil 并不会自动就认需要手动告诉它编译器在哪。打开 Keil点Project - Manage - Project Items或者更直接的方式是点菜单Project - Options for Target切到Target标签页。在ARM Compiler下拉框里如果 AC5 装对了位置你应该能看到Use default compiler version 5这个选项。如果下拉框里没有version 5 的选项说明 Keil 没找到。这时候需要手动添加点Edit - Configuration或者菜单栏的Project - Manage - Project Items里的 Folders/Extensions找到ARM Compiler相关的路径设置手动指向你 AC5 的安装目录比如C:\Keil_v5\ARM\ARM_Compiler_5.06u7\bin配置好之后重启 Keil再回到Options for Target下拉框里应该就出现 version 5 了。4.4 切换工程编译器版本选中Use default compiler version 5点 OK。然后重新编译工程。如果一切顺利之前那些 AC6 报的错应该全部消失编译能正常通过。提示切换编译器后建议先Rebuild All全部重新编译而不是增量编译。因为 AC5 和 AC6 生成的目标文件格式不兼容混着用会出问题。5. 常见报错与排查实录5.1 报错速查表我把这些年遇到的高频问题整理成表方便你对照排查。报错信息根本原因解决方法Cannot find ARM Compiler 5Keil 没找到 AC5 路径手动配置编译器路径The configured compiler version 5 is not availableAC5 未安装或安装不完整重新安装 AC5armcc.exe not found安装目录被移动或删除检查路径重新指定编译通过但链接报符号错误AC5/AC6 目标文件混用Rebuild All 全部重编启动文件报__asm语法错误仍在用 AC6 编译确认已切到 version 5编译速度异常慢优化等级设置过高调整优化选项5.2 几个典型场景的深入排查场景一下拉框里死活没有 version 5这种情况八成是路径没配对。先去文件管理器确认armcc.exe真实存在然后回到 Keil 的配置里把路径精确指到bin目录。注意路径里不要有多余的反斜杠或空格。配完一定要重启 Keil很多人配完不重启以为没生效其实是缓存问题。场景二切换后编译报一堆警告AC5 的警告比 AC6 多尤其是类型转换、未使用变量这类。这些警告通常不影响功能但如果你有强迫症可以在Options for Target - C/C里调整警告等级或者针对性加#pragma屏蔽。我的建议是老工程别追求零警告能跑起来、功能正常才是第一优先级。场景三编译通过但下载后不运行这往往不是编译器的问题而是分散加载文件.sct配置不对。AC5 和 AC6 对 .sct 的解析有差异切换后要检查一下 ROM/RAM 的地址范围是否和你的芯片匹配。尤其是用了 bootloader 的工程APP 的起始地址要改对。5.3 独家避坑经验说几个文档里不会写、但实际很坑的点别在中文路径下装 AC5。我见过有人装在D:\我的工具\编译器下结果 Keil 死活识别不了折腾一下午。改成纯英文路径秒好。装完 AC5 后如果同时装了 C51注意两者的路径不要冲突。Keil 支持 C51 和 MDK 共存但编译器目录要分开管理。备份你的 AC5 安装包。官方下载链接时不时会变等你换电脑想重装时可能就找不到了。我习惯把安装包和配置好的路径截图一起存到网盘。切换编译器后检查一下Options for Target - Output里的输出格式。有些老工程依赖.axf文件AC6 默认可能生成.elf需要手动改回来。6. 让老工程真正跑起来的收尾检查装好 AC5、切好版本、编译通过这只是第一步。要确保工程真正稳定运行还有几件事要做。6.1 检查启动文件和链接脚本打开工程的启动文件通常是startup_stm32f10x_hd.s这类确认里面的汇编语法是 AC5 风格。如果之前被人改成 AC6 风格了切回 AC5 后反而会报错需要改回来。链接脚本.sct也要核对确保 ROM 起始地址、大小和你的芯片一致。6.2 验证优化等级AC5 的优化等级从-O0到-O3还有-Os优化体积。老工程建议先用-O0或-O1编译确认功能正常后再逐步提高优化等级。因为高优化等级下AC5 可能会把某些依赖时序的代码优化掉导致跑飞。我踩过这个坑一个延时函数在-O2下被优化没了程序直接卡死。6.3 做一次完整的下载和运行测试编译通过不代表运行正常。用 ST-Link 或 J-Link 把程序下载进去观察实际运行效果。重点看时钟配置对不对、外设初始化有没有问题、中断能不能正常进。如果下载失败先排查是不是烧录器驱动的问题而不是编译器的问题——这两个经常被混淆。6.4 记录你的配置最后把你这次配置的关键信息记下来MDK 版本、AC5 版本、安装路径、编译器切换方式。下次换电脑或者帮同事装直接照着来能省大量时间。我自己就维护了一个环境配置.md每次装完更新一下几年下来成了宝贵的经验库。7. 关于 AC5 长期使用的几点个人体会AC5 虽然已经停止维护但在存量工程维护这个场景下它还会陪伴我们很多年。我的实际体会是不要为了追新而强行迁移到 AC6。迁移一个老工程到 AC6工作量可能比重新写一遍还大而且引入新 bug 的风险很高。除非有明确的性能或体积需求否则让老工程继续用 AC5 跑着是最经济的选择。另外如果你同时维护新老项目可以在同一台机器上让 AC5 和 AC6 共存Keil 支持在工程级别切换编译器版本。新工程用 AC6老工程用 AC5互不干扰。这样既享受了新编译器的优化又不用动老代码是目前最舒服的工作方式。最后分享一个小技巧如果你经常需要在多个工程间切换编译器版本可以在 Keil 里给不同工程设置不同的Options for Target配置保存成不同的 Target这样一键切换不用每次手动改。这个功能用的人不多但确实能提升效率。