简介面向Keil MDK 5.37开发者的ARM Compiler Version 5独立安装包解决MDK 5.37不再预置ARMCC导致ARM工程无法编译的问题适用于嵌入式、物联网及Cortex-M系列项目开发。压缩包共651个文件、约82.68MB核心包含bin目录下的armcc、armlink等可执行工具lib与include目录下的链接库和头文件以及汇编源文件、map映射、txt说明等类型这些组件联合工作支持C、C及汇编语言优化级别高可覆盖从编译到链接的完整工具链。已有6702人学习下载是MDK 5.37用户常用的补齐方案。包内目录按include、lib、bin、sw清晰组织bin存放编译驱动lib提供运行库include收录标准头文件sw附有示例组件拿到后解压配置环境变量即可在MDK中指定编译器路径正常编译同时可参照txt说明与示例理解链接配置和排错思路显著降低环境搭建成本。1. MDK 5.37 为什么默认不再内置 ARMCC版本策略变化复盘前阵子帮同事迁移开发环境他才装好的 Keil MDK 5.37打开一个老 STM32 工程直接编译报错控制台弹出一堆找不到“armcc”的提示。我过去一看果然ARM Compiler 下拉列表里只有 AC6也就是 Arm Compiler 6传统意义上的 ARMCCArm Compiler 5简称 AC5压根没装上。这不是安装姿势不对而是 MDK 5.37 本身的版本策略变了。从这一代开始ARM 把 Arm Compiler 5 从 MDK 主安装包里剥离了出去不再作为默认组件随安装包一起出现。你就算把 MDK 5.37 从头到尾完整安装一遍ARM 目录下也不会生成我们熟悉的ARMCC文件夹需要用户自己单独下载、单独安装、手动注册。这个变化对老用户的影响非常大。很多存量工程、公司内部 SDK、第三方中间件库都是基于 ARMCC V5 构建的代码里动不动就是__attribute__((section(xxxx)))、老式内联汇编、__forceinline这类 AC5 风格写法。放到 AC6 下要么编译不过要么大量告警甚至运行行为都变了。所以在 5.37 时代“给 MDK 补装 ARMCC”成了一项刚需操作。我个人复盘下来ARM 这么处理倒也不难理解。AC6 基于 clang/LLVM是官方明确的主力方向新功能、新架构支持基本都往 AC6 上堆。而 AC5 已经进入维护期没必要再继续捆绑在 MDK 安装包里增加体积和兼容性负担于是改成独立组件、按需下载。只是苦了还在维护老项目的工程师——装完 MDK 第一件事不是建工程而是先给编译器“补票”。所以这篇内容就是针对 MDK 5.37以及后续 5.38、5.39 同策略版本的 ARMCC 独立安装实操。我把从发现问题、确认原因、下载安装、注册配置到解决各种报错的完整流程整理了一遍照着走基本不会卡壳。2. 判断是否缺少 V5 编译器的三条线索与完整排查链路遇到“MDK 5.37 没有 ARMCC”的问题时不要着急重装整个 MDK。先花两分钟确认一下到底属于哪种情况避免后面白折腾。我总结出三条非常典型的判断线索。2.1 线索一旧工程编译直接报错最容易感知的情况就是老工程一打开、一编译Output 窗口直接抛错。常见的有两种形态报“Target uses ARM-Compiler and has no compiler installed”或类似描述意思就是当前 Target 选择了 ARM Compiler V5但系统里压根没装。报“*** error: createprocess failed, command: ... armcc ...”意思是 Keil 尝试调用armcc.exe失败了典型原因就是文件不存在或路径不对。如果你看到的是这两种报错基本可以断定这个工程指定用的是 V5 编译器而当前 MDK 环境里没有对应编译器。2.2 线索二编译器下拉列表里只剩 AC6这是最直观的判断方式。打开菜单栏里的Project - Manage - Project Items切换到Folders/Extensions选项卡看最下面的ARM Compiler下拉列表如果列表里只有Arm Compiler 6.x或者 “Use default compiler version 6”那就说明本机只装了 AC6没有 AC5。如果那个下拉框直接是空白的更惨说明连 AC6 都没正确识别这种情况通常是 MDK 安装本身出了问题需要检查系统环境变量或者重装 MDK。正常情况下的理想状态是下拉框里同时存在V5.06 update 7 (build 960)和V6.x这样才能在工程间自由切换。2.3 线索三安装目录里没有 ARMCC 文件夹打开你的 MDK 安装根目录比如D:\Keil5或C:\Keil_v5进入ARM子目录你会看到ARMCLANG、CMSIS、PACK、Startup之类的文件夹。注意找一下有没有ARMCC目录如果ARM目录下根本没有ARMCC那情况已经很明确了。如果存在ARMCC但里面只有零散文件没有bin\armcc.exe那多半是之前安装过但被清理不干净或者安装文件损坏。这里还有个容易误导人的地方很多人会去 Pack Installer 里找 ARM Compiler 的包。在 5.36 及更早版本Pack Installer 的 Pack 列表里确实可以找到并下载 ARMCC但从 5.37 开始ARM Compiler 不再以 Pack 形式分发你去 Pack Installer 翻半天也找不到入口。这是版本策略调整导致的认知盲区看到了可以直接跳过。完整排查链路建议这样走一遍打开旧工程尝试编译记录报错关键词。进入Project - Manage - Project Items - Folders/Extensions查看ARM Compiler下拉列表。到 MDK 安装目录的ARM文件夹下确认是否存在ARMCC目录。打开 Pack Installer 搜索“ARM Compiler”确认是否还能找到5.37 后基本找不到。三步走完如果结论是“缺 V5”那就进入下一步下载安装 ARM Compiler 5.06。3. 独立安装 ARM Compiler 5.06安装包获取与 msi 安装过程ARM Compiler 5 的最后一个版本是 5.06 update 7build 960这也是我在多个工程里实测最稳的版本。下载和安装有几个细节需要留意不然容易卡在入口。3.1 官方下载渠道与版本选择常见渠道有两条ARM 官网的“Arm Compiler for Embedded”产品页面进入 Legacy Software 区域可以找到 Arm Compiler 5.06 for Keil 的独立安装包。这个页面通常要求注册并登录 ARM 账号免费下载但下载链接有时藏得比较深。Keil 官网的下载中心MDK 5.37 的产品说明页里会列出可选的“Additional Components”或“Legacy Support”其中包括 ARM Compiler 5.06 update 7 的安装包。下载后你会得到一个压缩包或直接是msi格式的安装程序文件名类似ARM.Compiler.5.06u7_Windows_x86_x64.msi。注意别下成Arm Compiler 6的安装包两者完全不一样。版本选择上我强烈建议认准5.06 update 7 (build 960)不要去找更老的 5.06 初版或 5.05。老版本在 Win10、Win11 上存在不少兼容性问题比如头文件解析异常、浮点库缺失、链接阶段随机报错等。而 5.06 update 7 是 AC5 系列最后的正式发布版补丁打得最全兼容性最好。3.2 msi 安装的路径选择与注意事项拿到msi文件后双击运行。安装向导比较简单但有一个关键选择安装路径。我先说一个最容易踩的坑如果你的 MDK 主程序装在 D 盘而 msi 默认路径给的是C:\Keil_v5\ARM\ARMCC千万别直接一路 Next。否则装完后 Keil 不一定能自动识别因为 MDK 在注册表里记录的安装根目录和编译器实际位置对不上后续你还得手动添加路径多一道麻烦。更稳的做法是把 ARMCC 的安装路径改成和你的 MDK 主目录保持一致。比如 MDK 装在D:\Keil5那 ARMCC 就装到D:\Keil5\ARM\ARMCC。这样 Keil 按照原有目录结构扫描时往往能直接发现它省去手动注册的步骤。安装过程中还有两个细节如果杀毒软件弹出拦截提示先放行。MSI 安装器要往 Program Files 或 MDK 目录写入文件部分安全软件会误报。我在实机上遇到过 360 拦截armcc.exe的动态库注入导致编译时随机崩溃。安装路径不要包含中文或特殊字符。比如D:\编译器\ARM\ARMCC这种路径AC5 老编译器对非 ASCII 路径支持极差编译时会出现诡异的头文件找不到错误。安装完成后去ARM\ARMCC\bin目录看一眼确认armcc.exe存在。可以顺手在命令行里执行armcc.exe --version能看到版本号如Product: ARM Compiler 5.06 update 7 (build 960)就说明安装成功。4. Keil 里的编译器注册与路径绑定装完必须做的收尾配置编译器装好了不代表 Keil 会自动用上。最常见的情况是打开 Keil发现 ARM Compiler 下拉列表还是只有 AC6跟没装一样。这时候需要手动把 V5 注册进去。4.1 在 Project Items 里登记编译器路径操作路径是打开 Keil MDK进入菜单Project - Manage - Project Items。切换到Folders/Extensions选项卡。在ARM Compiler下拉框右侧找到Add another ARM Compiler to list...按钮。文件选择对话框中浏览到上一步安装的ARMCC目录注意是包含bin子目录的那一层不是bin内部选中后点击确定。片刻后下拉列表里就会出现类似V5.06 update 7 (build 960)的选项。如果下拉框里没有出现可能的原因有两个一是你选的目录层级不对Keil 真正识别的是ARMCC\bin的上级目录二是 MSI 安装的 ARMCC 版本太老build 号没达到 Keil 最低识别要求建议换 5.06 update 7。4.2 工程级编译器切换让老工程真正用上 V5编译器在全局层面注册好了还要确保具体工程用的是它。打开目标工程的Options for Target切到Target选项卡底部有一个ARM Compiler下拉框如果是老工程默认会显示 “Use default compiler version 5” 或者指定的某个 V5 版本。只要全局注册成功这里会自动识别。如果显示的是 V6就手动把它改成刚注册的 V5.06 update 7。改完之后重新编译注意观察编译输出窗口。如果命令行里出现的是armcc而不是armclang说明 V5 编译器已经真正接管了编译过程。另外工程代码里可以用条件编译宏__CC_ARM来验证这是 ARMCC 特有的预定义宏只有 V5 编译器下才会自动定义。补充一个工程层面的经验如果整个解决方案下有很多个分散在不同目录的工程最省事的方式是在Folders/Extensions选项卡里把 V5 设为默认编译器这样后续所有工程默认都会优先使用 V5只有需要 V6 优化时才在工程级改回来。对于老项目批量维护能省不少事。5. 实际编译遇到的经典报错与处理经验ARMCC 装好、注册好之后老工程通常能顺利编译但还有几类高频问题值得单独说一下。这些都是我在实际项目里一次次踩出来的网上问的人也多。5.1 高频报错CreateProcess failed报错形态一般是*** error: createprocess failed, command: D:\Keil5\ARM\ARMCC\bin\armcc.exe --c90 ...这道报错看着像编译器没装好其实绝大多数情况下是这三个原因之一路径问题armcc.exe实际不在报错显示的路径下。这时候直接去资源管理器确认文件是否存在如果不存在打开Manage Project Items检查编译器注册路径是否又指到了旧位置。权限不足工程放在系统保护的目录或者杀毒软件拦截了编译进程的创建。解决方法是把工程移到一个普通文件夹比如D:\Work\Project并给 MDK 安装目录加白名单。环境变量残留机器上装过老版本 KeilPATH 里残留了指向旧 ARMCC 路径的变量导致 Keil 调到了不存在的程序。建议打开系统环境变量把旧的 Keil 相关路径清理干净。这类问题排查时最快的方式是复制报错里的命令行去掉多余参数单独执行一下armcc.exe --version如果能正常输出版本信息就说明编译器本体没问题问题出在 Keil 调用链路上。5.2 高频告警registered arm compiler ignored, version needs to be 5 or higher这条告警在命令行构建或 CI 自动化编译时特别常见*** warning: registered arm compiler ignored, version needs to be 5 or higher它的意思是Keil 在读取注册表或默认配置时找到的 ARM 编译器版本低于 5比如旧 Keil 4 留下的编译器条目因此直接忽略。这种告警往往伴随构建失败。处理方法还是回到Project - Manage - Project Items - Folders/Extensions确认下拉框里选中的确实是V5.06 update 7 (build 960)。如果下拉框里混入了 V4.x 的旧条目手动删掉它。另外检查注册表HKEY_CURRENT_USER\Software\Keil\ARM\Toolchain下的键值如果指向的是旧路径要么改掉要么清理这种残留通常是多个版本 Keil 共存后留下来的。5.3 V5 在 Win10/11 上的其他坑ARMCC 5.06 update 7 虽然在 Win10/11 能跑但有一些小毛病项目路径或工作区路径过长时AC5 的旧文件系统处理逻辑会抽风报“cannot open source file”这类假错误。解决办法是把整个工程目录缩短尽量让完整路径小于 150 个字符。编译器对中文注释编码处理有时会出问题。如果一个.c文件里用了 GB2312 中文注释而源文件编码和 Keil 配置不一致AC5 偶尔会在解析阶段报莫名其妙的内存错误。老项目建议保持File - Encoding编码设置与源文件实际编码一致。不要在 V5 下尝试 ARMv8-M 的新特性比如为 Cortex-M33 开启 TrustZone 相关优化。AC5 对 M23/M33 的支持属于“能用但不完整”的状态老项目维持老芯片就没问题新芯片还是老实切到 AC6。6. 5.37 环境下 V5 与 V6 共存的注意事项装好 V5 之后系统里就有了 AC5 和 AC6 两套编译器共存本身没有冲突Keil 通过下拉列表分别管理。但有几个场景需要额外注意。6.1 什么时候坚持用 V5什么时候可以迁到 AC6我给团队的判断标准很简单能编译就不动新工程才考虑 AC6。内部有大量历史代码、成熟的老 SDK 引用了很多 AC5 专有扩展语法优先坚持 V5。比如__forceinline、__packed、__align这类关键字在 AC6 下要改成__attribute__((always_inline))、__attribute__((packed))等改动面大且风险高。代码基础干净、工作量可控且确实需要 AC6 的优化能力和新架构支持可以考虑迁移。AC6 的代码体积优化整体优于 AC5尤其开了-O2之后差距明显但迁移时要把--c99、--gnu这类编译选项对应到 AC6 的-stdc99、-stdgnu11上否则会卡在一堆宏和告警上。如果是同一个工程里混合使用 ARMCC 和 ARMCLANG千万不要去共享同一个中间目录。建两个不同的输出目录分别编译否则.o文件混在一起链接阶段会出现“file is not an object file”之类的诡异问题。我在 5.37 AC5 的组合下维护了三个老项目运行半年多没出过兼容性问题所以从稳定性角度老工程继续用 V5 是完全站得住脚的。6.2 多套 Keil 工具链共存的注册表冲突一个老生常谈的问题同一台电脑能同时装 Keil 4、Keil C51 和 MDK 吗答案是可以但要注意注册表项之间的互相干扰。C51 用于 8051 单片机MDK 用于 ARM两者 IDE 共用同一个UV4.exe安装顺序不同会导致最后生效的 IDE 配置不同。我推荐的共存顺序是先装 Keil C51再装 MDK让 MDK 的 IDE 组件最后覆盖注册表。Keil 4 的工程在 MDK 5 里打开时会提示升级确认迁移前先备份。多版本共存的机器上编译器注册表项容易被旧版本覆盖。换句话说你前一天用的还是V5.06 update 7某天装完 C51 后回来Keil 默认编译器又变回老版本或识别不到。这种时候直接按第 4 节的方法重新注册一次不用重装 MDK。另外补充一个实用小技巧如果你装了 MDK 同时又要维护 51 工程最省心的是把 C51 和 MDK 装到同一个目录树下比如都装到C:\Keil_v5统一用同一个 UV4 入口管理。这样工程窗口里可以同时看到 51 和 ARM 两种设备列表切换芯片类型时不会乱。6.3 我实践的最终感受与建议折腾完这一整套流程之后我的真实体会是MDK 5.37 环境下用 ARMCC 没有想象中复杂核心就三步——下载 5.06 update 7、安装到 MDK 同目录、在 Project Items 里手动注册路径。真正耗时间的往往不是安装过程而是“以为装好了但没用上”的中间状态。如果你照着前面步骤操作后编译还是报错我建议先把我第 5 节提到的几个经典报错对照一遍特别是 CreateProcess failed 和 registered arm compiler ignored 这两条。它们表面上看着像编译器坏了实际上八成是路径或注册表问题。最后还想提醒一点ARM Compiler 5 已经处于维护末期新版本的 MDK 只会对 AC6 做深度适配。如果你手头的老项目近期还没有迁移计划建议先把 5.06 update 7 的安装包归档保存到本地或公司服务器以免日后官网下载入口变动找不到了再干着急。本文还有配套的精品资源点击获取