Keil MDK 5.37升级后ARMCC V5编译器缺失?恢复老工程编译环境全攻略

发布时间:2026/9/28 1:15:11
Keil MDK 5.37升级后ARMCC V5编译器缺失?恢复老工程编译环境全攻略 最近又有一批朋友在升级 Keil MDK 到 5.37 之后跑过来问我说编译一个老工程直接报错而且报的错看着根本不是代码语法问题。其实这个问题这两年特别常见尤其是从 5.36、5.37 开始ARM 官方默认安装包里面已经不再捆绑 ARMCC V5 编译器了。很多从 STM32 标准库、老的国产芯片 SDK 或者某些特定 RTOS 工程迁移过来的朋友一编译就是满屏红色错误第一反应都是以为自己代码写错了实际上就是 MDK 找不到 V5 编译器。我自己的主力开发环境从 MDK 4.74 一路用到现在手上攒了不少老工程有一批还是必须依赖 ARMCC V5 的。这篇文章就把我这几轮升级、踩坑、恢复编译环境的完整过程写出来包括 V5 编译器怎么下载、怎么塞回 Keil、怎么在工程里手动指定以及升级后最常见的几个编译报错怎么排查。内容全部基于我实际测试过的环境按步骤操作基本可以一步到位。1. 升级后编译报错的根本原因先说清楚一件事MDK 5.37 本身不是不能编译 ARMCC V5 的工程而是它默认安装的时候根本没带 V5 编译器。ARM 从某个版本开始把安装包里面的 ARMCC V5 移除掉了只保留基于 Clang 的 AC6 工具链。这就导致你的工程文件还在但编译器工具链缺失一编译自然就炸了。1.1 5.37 到底改了什么MDK 5.37 最大的变化就是把默认的 ARM 编译工具链锁定为 AC6。以前从 5.24 到 5.36 这个区间你装完 Keil 之后安装目录下通常会有两个编译器目录C:\Keil_v5\ARM\ARMCC\bin C:\Keil_v5\ARM\ARMCLANG\binARMCC 就是 AC5ARMCLANG 就是 AC6。但在 5.37 这个版本里你装完会发现ARMCC这个目录整个没了只剩ARMCLANG。如果你的工程文件之前是用 AC5 编译的工程配置里写的还是 V5MDK 打开工程后找不到ARMCC就会直接报“Target uses ARM-Compiler ‘V5’ but that is not installed”。这个报错不是我夸张几乎 80% 的人升级后遇到的就是它剩下 20% 是工程里已经切到 V6 但代码一堆语法错误。所以解决问题的核心思路很简单把 ARMCC V5 的完整目录补回去然后在 Keil 的设置里把编译器路径指对它工程里再选回 V5就完事了。1.2 AC5 与 AC6 工具链的本质区别很多人对 AC5 和 AC6 的区别只有一个模糊概念一个是老编译器一个是新编译器。但实际用起来差别非常大这里简单给大家理一下。ARMCC V5 也叫 AC5是 ARM 自家开发的 C/C 编译器编译 C 语言时遵循的是 C90/C99 标准对老代码的兼容性极好。很多老外设库、寄存器头文件、启动文件都是在 AC5 时代写的里面的内联汇编、关键字写法、结构体对齐方式拿到 AC6 下编不过很正常。ARMCLANG 也就是 AC6底层是 LLVM/Clang编译器核心更先进优化策略更好、告警信息更全面对新版 C 标准支持也好但它对老代码的挑剔程度高很多。比如__attribute__((section(name)))的写法、#pragma的个别指令、内联汇编的格式AC5 和 AC6 都不一样。这也是为什么很多老工程强行切到 V6 之后第一波报错全是各种语法层面的东西看着跟代码烂掉了一样实际是编译器对代码的解读规则变了。1.3 哪些项目必须用 AC5如果你满足下面任何一个条件强烈建议直接补回 AC5别去折腾把代码改成 AC6 兼容项目用的是 STM32 标准外设库SPL而不是 HAL 库工程是老同事留下的代码里有大量__asm内联汇编或者分散加载文件用了旧语法芯片厂商提供的 SDK 里明确写了支持 Keil AC5项目里用了某些老的中间件、DSP 库或者加密库只给了 AC5 版本的 .lib你只是想把工程打开看一眼不想动代码我个人建议是能用 AC5 编译的老工程就别强行切 AC6不是切不过去而是投入产出比低。代码不是你写的出问题你根本不知道是哪句话触发了新编译器的脾气。2. ARMCC V5 编译器的获取与关键文件解析既然确定了要补回 AC5下一步就是拿到 ARMCC V5 的完整文件。这一步很多人卡住了因为网上搜下来的资源乱七八糟要么版本不对要么文件缺胳膊少腿。这里我把自己验证过可行的几种获取方式列出来。2.1 获取 ARMCC V5 的几种途径第一种如果你电脑上还装着旧版本的 Keil比如 5.23、5.30、5.33 之类的不管是自己电脑还是同事电脑找到安装目录把整个ARM\ARMCC文件夹复制出来就行。这是最快的办法。第二种从 ARM 官方以前发布的 MDK 历史版本安装包里提取。ARM 官网的下载中心和 Keil 官网的“Previous Versions”页面都能找到历史安装包。装一个旧版本 Keil 到别的目录比如 5.33装完把ARMCC目录复制出来再把旧版卸载或直接放着不用都没问题。第三种网上一些嵌入式资源站会单独提供 ARMCC V5 的安装包但这类资源质量参差不齐。我自己不太建议下那种所谓“一键安装包”因为你不知道工具链有没有被改动过编译器这种东西一旦被动过手脚排查问题的时候会非常痛苦。2.2 目录结构与关键文件ARMCC V5 拿到手后正常目录结构是这样的ARMCC\ ├─ bin\ │ ├─ armcc.exe │ ├─ armasm.exe │ ├─ armlink.exe │ ├─ fromelf.exe │ ├─ armar.exe │ └─ ... ├─ include\ ├─ lib\ └─ sw\microlib\armcc.exe是 C/C 编译器armasm.exe是汇编器armlink.exe是链接器fromelf.exe是生成 bin/hex 镜像的工具这 4 个是核心缺一个都跑不起来。include和lib目录是标准头文件与库文件也不能缺。这里有个容易忽略的地方ARMCC\bin里通常还有armcl.exe和ArmCC_v5.06_update7.exe之类的文件前者是命令行编译工具后者是自带版本信息的小工具。如果你拿到的文件夹里bin目录下没有armcc.exe这个主程序八成是个残缺版本。2.3 版本选择5.06 update 6 还是 update 7ARMCC V5 的最终版本是 5.06 update 6也就是版本号显示为 5.06 update 65060750后面其实还有一个 update 75060840。从实际使用来看5.06 update 6 是兼容性最好、流通度最高的版本绝大多数教程、工程模板、SDK 都是在这个版本下测试的。我自己用的是 5.06 update 6稳定用了很多年也没有遇到过需要 update 7 才能解决的问题。如果你要兼容多个项目我建议就用 update 6别追新稳定压倒一切。3. 手动添加 ARMCC V5 到 MDK 5.37 的完整步骤拿到 ARMCC 文件之后接下来就是把它正确放到 Keil 里。这里有几个关键点步骤本身不难但路径放错或者配置不对后面编译还是继续报错。3.1 确认 MDK 安装目录与备份首先确认你的 Keil MDK 安装在哪个目录。正常情况下是C:\Keil_v5但有些同事喜欢装到别的盘比如D:\Keil_v5。你打开 Keil菜单栏Project - Manage - Project Items或者直接看Options for Target - Target页签下的Arm Compiler下拉框可以看到当前编译器状态。但看安装路径最简单的方法是桌面右键 Keil 图标打开文件所在位置。如果 Keil 正在运行建议先关掉。然后去安装目录下的ARM文件夹里看一眼确认是不是真的没有ARMCC目录。如果有说明你拿到的安装包其实带 AC5就不需要折腾后面的步骤了如果没有继续往下。3.2 将 ARMCC 文件夹放入 ARM 目录把前面准备好的ARMCC文件夹完整复制到C:\Keil_v5\ARM\目录下。注意是C:\Keil_v5\ARM\ARMCC不是C:\Keil_v5\ARMCC。很多人这一步就放错了结果 Keil 识别不到。放好之后ARM目录下应该同时存在ARMCC和ARMCLANG两个文件夹这样才是 V5、V6 共存的完整状态。3.3 配置 Keil 的编译器路径这一步容易被漏掉。光把文件夹放进去Keil 有时候不会自动识别你需要手动让它重新扫描一遍。打开 Keil进入Project - Manage - Project Items在弹出的窗口左侧切换到Folders/Extensions页签。这里你会看到各个工具链的路径设置包括 ARM 编译器。如果ARMCC路径没有自动填上手动点浏览按钮选择到C:\Keil_v5\ARM\ARMCC\bin这一层就行。设置完之后点确定Keil 会重新加载工具链信息。这时候再打开工程的Options for Target切到Target页签看Arm Compiler下拉框正常情况下应该能看到Use default compiler version 5或者V5.06 update 6之类的选项了。3.4 工程级编译器版本切换工具链识别到了工程的配置也要切回去。打开你的工程选择要编译的 Target右键进入Options for Target在Target页签下找到Arm Compiler下拉框默认情况下可能是Use default compiler version 6手动切到Use default compiler version 5或者直接选V5.06 update 6。这里顺便多一句如果你的工程里同时有多个 Target比如一个 Debug 一个 Release每个 Target 都要单独检查一遍编译器版本别只改一个然后发现另一个还在用 V6 报错。3.5 验证编译环境是否正常配置完成后最好先做一次全量编译验证环境。比如随便打开一个原本报错的工程点Rebuild看看输出窗口还有没有“compiler not installed”之类的错误。第一次编译可能会提示你要不要在工程目录下创建新的RTE文件之类的东西正常确认即可。如果工程比较大第一次全量编译会比平时慢因为这相当于把所有源文件拿 AC5 重新编了一遍。我的经验是全部配置正确之后输出窗口应该会显示compiling xxx.c...、linking...、Program Size: Code...这样的正常流程不会再出现关于编译器缺失的错误。4. 升级后最常见的编译报错与排查技巧配好 AC5 之后大部分人的编译就恢复正常了。但还有一部分人会在升级过程中遇到各种周边问题我挑几个最高频的列出来顺便把排查思路也讲清楚。4.1 常见报错速查表报错信息出现原因解决方案Target uses ARM-Compiler V5 but that is not installedKeil 找不到 AC5 编译器按第 3 步补回 ARMCC 目录并配置路径*** Error: CreateProcess failed, Command: ...\fromelf.exe...fromelf 路径错误或文件缺失确认ARMCC\bin\fromelf.exe存在在 Options 里检查 User 页签的 fromelf 调用路径#error Must use ARMCC V5某些 SDK 或固件库自带的编译器版本检查确认工程使用的编译器是 AC5不要试图绕过这类检查L6002U: Could not open file: xxx.lib链接器找不到某个库文件检查库搜索路径Options - Linker - Misc controls或Libraries设置Warning: C3910W: Old syntax, please use --c99代码是旧式 C 语法AC5 下可在 C/C 页签增加--c99编译选项Fatal error: C:\Keil_v5\ARM\ARMCC\bin\armcc.exe: No such file or directoryARMCC 目录缺失或路径配置错误检查Folders/Extensions里的路径是否指向正确的bin目录4.2 “CreateProcess failed” 报错的实际处理过程这个报错是很多朋友卡得最久的地方。它的完整形式一般长这样*** Error: CreateProcess failed, Command: C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\xxx.bin .\build\xxx.axf看到这个第一反应是检查这个路径下有没有fromelf.exe。如果文件在那大概率是路径里的反斜杠和空格问题特别是在工程放在带空格的路径下时容易出现。解决办法是把工程路径全部改成不含空格的英文路径或者把Options for Target - User页签里的After Build/Rebuild用户命令重新填一遍。还有一种情况是命令里的输出目录不存在比如.\output目录还没创建fromelf 执行时就报错。在 User 页签的命令行里手动加上mkdir命令创建目录或者直接在工程下建好对应文件夹即可。4.3 编译器切换之后代码报错的排查思路有一种情况是你确实把编译器切到了 V5但编译还是报错而且报的是各种源代码层面的错误。这时候要冷静先看是哪些文件报错如果是你自己写的.c文件大概率是语法兼容问题如果是 SDK 或库文件的报错可能是编译选项不匹配。我的排查顺序是先看是不是C/C页签里的Language mode设置不对。AC5 默认是按 C90 标准走如果你的代码用了//注释以外的 C99 特性建议在Language mode里直接选c99。再看有没有定义错误的宏比如芯片型号、时钟频率相关的宏这种问题在升级后经常发生。4.4 关于 ARMCC V5 的许可问题这里必须说一个重要事情MDK 的许可机制从 V5 到 V5.37 之后对旧版 ARMCC 的授权逻辑没有变化只要你的 MDK 本身有正版 License不管是 License 文件形式还是 PACK 形式的授权都能正常编译 AC5 工程。如果你用的是评估版会有编译大小限制这是 Keil 本身的限制和 AC5/AC6 没有关系。从正规渠道购买或申请评估 License 之后ARMCC编译器的使用是完整、合法的这点大家放心不需要额外再去折腾其他东西。5. 关于 AC5 与 AC6 共存的几点实操心得最后再写一点我自己长期使用下来的心得体会包括环境维护的细节和一些容易踩坑的地方。这些东西平时文档里不太会写但对长期做开发的人来说非常实用。5.1 ARMCC 目录最好单独备份编译器文件本身不大整个ARMCC目录也就一百多兆。我建议拿到可用的ARMCC文件夹之后直接压缩一份放到网盘或者移动硬盘里。以后不管换电脑还是重装系统直接把压缩包解压到C:\Keil_v5\ARM目录下配一下路径就恢复环境了比到处找资源快得多。我自己有个习惯安装目录下会保留ARMCC和ARMCLANG两个完整的编译器文件夹装最新版 Keil 后也不会去动ARMCLANG这样新老工程同时支持互不干扰。5.2 不要乱删 ARMCLANG 目录有些人觉得反正只用 AC5就把ARMCLANG删了省空间。我劝你别这么干。原因有两个第一Keil 本身的一些组件、Pack 的安装和更新需要依赖 AC6 工具链第二如果你哪天想尝试编译器升级、或者要用 CubeMX 等工具生成默认 AC6 工程没有 ARMCLANG 又会陷入同样的困境。5.3 老工程升级的合理策略如果你手上有大量老工程我建议的升级策略不是一次性全切到 AC6而是先保证当前项目可以正常编译、发布再在空余时间挑一个非核心的模块尝试切 AC6 并修复代码兼容性问题。任何编译器升级都可能引入新的告警和默认行为差异遇到问题再逐步修改比在大项目上直接全量切换要稳妥得多。5.4 编译器路径自动识别的一个小技巧有时候你明明把ARMCC放到正确位置了但 Keil 的Folders/Extensions里就是没有自动出现路径。这时候可以试试关掉 Keil删除工程目录下的.uvguix文件比如xxx.uvguix.YourUserName再重新打开工程。这个文件是 Keil 的窗口布局和用户配置缓存删掉后 Keil 会重新读取工具链环境有时候路径就能正确识别了。这个技巧是我有一次折腾到半夜无意中发现的后来在好几个同事的机器上都验证有效算是比较冷门但管用的方法。5.5 善用命令行编译排查环境问题如果你觉得 Keil 图形界面的错误信息不够具体可以直接用命令行方式手动调用 ARMCC 试一下最容易确认工具链本身是否正常。打开 CMD进入C:\Keil_v5\ARM\ARMCC\bin目录执行armcc.exe --version正常会输出版本信息比如Arm Compiler 5.06 update 6。如果提示不是有效的程序那就说明文件有问题或者系统环境变量没对上。另外也可以试fromelf.exe --help确认转换工具正常。两步都通过基本可以确定工具链本体没问题问题就在 Keil 的配置上。5.6 最后的经验之谈我踩过太多 Keil 升级的坑了说句实在话MDK 的版本升级对老工程来说从来都不是小事。很多时候不是你代码写错了而是工具链的行为变了。这篇文章里写的方法本质就是“让新版本 Keil 重新支持老编译器”操作不复杂但非常实用。另外虽然我这里讲的都是 MDK 5.37但同样的思路对 5.38、5.39 甚至更新的版本一样适用。ARM 官方后续版本依然不会默认带 AC5所以你只要按照上面的流程把ARMCC目录补回去就能在任意较新版本的 MDK 下继续编译你的 AC5 老工程。希望这篇文章能一次帮你解决问题如果你在操作过程中遇到我没提到的报错可以沿着“工具链是否完整 - 路径是否指对 - 工程配置是否切到 V5”这条线逐项排查绝大多数问题都出在这三个环节上。