简介:ARM编译器版本5是一款专为ARM架构处理器打造的优化编译工具,面向嵌入式系统开发者、固件工程师以及需要在不同ARM内核间保持代码可移植性的项目团队。该资源提供Windows平台下的完整安装包,共三个文件:一份HTML格式的发行说明、一个EXE安装引导程序以及一套MSI编译器安装主体,压缩包整体约80.94MB,能够帮助开发者快速完成工具链部署。资源目前已有4433人学习下载,是配置ARM编译环境时可参考的实用资料。通过安装并查阅发行说明,开发者可以掌握版本5对C/C++和汇编的支持特性,理解O0至O3多级优化、VFP浮点运算加速、Thumb指令集支持以及对ARM7到Cortex系列核心的适配范围,同时还能依据官方说明规避已知问题、调整编译选项,使生成的代码在体积和执行性能之间取得更优平衡,切实提升嵌入式项目的开发效率。 先说我撞上这问题的场景吧。上个月帮同事配了台新电脑,装上最新版Keil MDK 5.39,顺手打开一个三年前做的电机控制工程,按下Build,编译输出窗口直接弹了一条让人血压升高的信息:
Target uses ARM-Compiler 'Default compiler version 5' which is not available.
翻成大白话就是:这个工程指定要用ARM编译器版本5,但你电脑里根本没有这东西。紧接着还有一句搜索热词里大家常问的“missing: Compiler version 5”,整个工程彻底编译不了。当时我第一反应是Keil没装好,于是重装了三遍,结果还是一样。后来才搞明白,问题根本不在安装包是否完整,而在于ARM编译器版本5已经不再是新版MDK默认自带的组件了。
先把概念捋清楚,避免后面越绕越晕:这里说的“ARM编译器版本5”不是Keil版本号,而是ARM官方工具链自己的一个大版本,行业里一般叫它AC5,编译器可执行文件叫armcc。Keil MDK只是把ARM编译器集成到IDE里,本身不改编译器逻辑。你可以装MDK 5.39这样很新的IDE,但底层编译器还是5.06 update 7这样的老家伙,或者直接换成6.x系列(AC6,armclang)。所以“missing: Compiler version 5”翻译一下就是:工程文件点名要AC5,但MDK扫描了一圈发现没装。
这篇文章我就按自己实际解决这个问题的完整过程来写,从报错原理、装机步骤、验证方法到后续要不要迁移AC6,一次说透。不管你是刚接手老项目的实习生,还是被存量固件困住的老工程师,照着操作就能把编译环境救回来。
1. 编译器版本5为什么会“凭空消失”:Keil查找逻辑与文件目录结构
要回答这个问题,得先看一下两款编译器在硬盘上的真实位置,以及MDK是怎么知道“系统里有哪几个编译器”的。
1.1 两款编译器在你硬盘上分别住在哪里
以最常见的默认安装路径C:\Keil_v5为例。如果你装的是带AC5的旧版MDK(比如5.36及更早),打开C:\Keil_v5\ARM目录,会看到两个关键子文件夹:
ARMCC:AC5的安装位置,可执行文件叫armcc.exeARMCLANG:AC6的安装位置,可执行文件叫armclang.exe
如果你用的是MDK 5.37及以上版本,并且安装时没有额外勾选旧版本兼容组件,那么在C:\Keil_v5\ARM下很可能只有ARMCLANG,没有ARMCC。这个ARMCC目录不存在,MDK自然找不到AC5,于是工程一编译就报missing。
一个容易被忽略的事实是,AC5并没有被官方“消灭”,它只是不再默认安装而已。你完全可以把它单独装回来,装好之后继续配合新版MDK使用,两个编译器版本可以在同一个IDE里并存,互相不干扰。
1.2 工程文件里那行不显眼的“编译器ID”记录
Keil工程文件(.uvprojx)本质上是个XML文本文件。用记事本打开老工程,翻到和编译器相关的区域,通常能看到类似这样的内容:
<uAC5>1</uAC5> <TargetArmAds> <ArmAdsMisc> <useUlib>1</useUlib> <WarningLevel>3</WarningLevel> </ArmAdsMisc> </TargetArmAds>其中uAC5这个标签为1,就表示整个Target在创建时被设定为使用AC5编译器。MDK加载工程时读到这个标记,就会去“编译器注册表”里查有没有对应可执行程序,查不到就把曾经正常工作的工程标记为编译不可用。
这也解释了另一个常见现象:你可以正常打开一个新建的AC6工程,但同一个源码文件夹里的老工程却报missing。因为两个工程文件里请求的编译器不同,当前环境只满足其中一方。
1.3 TOOLS.INI:MDK的编译器“户口本”
Keil安装目录下的TOOLS.INI,相当于这个IDE的“户口本”。里面记录了所有已安装组件的名称和路径,MDK启动和加载工程时都会读它。正常情况下,AC5装好之后,TOOLS.INI里会多出一条指向ARMCC的登记信息。
但这里有个坑:用户手动挪动Keil_v5这个文件夹的整体位置之后,TOOLS.INI里登记的路径就会失效。比如你把C:\Keil_v5剪切到了D:\Keil_v5,但工程配置里指向的还是旧路径,MDK找不到ARMCC目录,照样给你报missing。
所以排查“编译器版本5缺失”的正确顺序是:先看ARMCC文件夹在不在,再看TOOLS.INI里登记的路径对不对,最后才考虑重装。很多人一上来就重装整个Keil,结果装完发现还是报错,因为根本不是安装的问题。
2. 找回AC5的标准操作:组件安装、版本指定与路径校验
现在说怎么修。我走过一遍完整流程,把可行方案按推荐顺序列出来,你照着做就行。
2.1 第一步:确认你到底缺的是“整个AC5”还是“路径失联”
打开文件资源管理器,进入C:\Keil_v5\ARM,看是否存在ARMCC文件夹,并且子目录bin下确实有armcc.exe。
- 如果ARMCC文件夹存在:问题大概率是路径或注册信息不对。这时不需要重新安装任何东西,先尝试在MDK里进入
Project -> Manage -> Project Items -> Folders/Extensions,在编译器列表中重新指定AC5的路径到C:\Keil_v5\ARM\ARMCC,确认后重新编译试试。 - 如果ARMCC文件夹不存在:按下面第二步操作。
2.2 第二步:安装ARM Compiler 5.06 update 7组件
新版MDK里找回老编译器,正规途径是安装官方发布的“ARM Compiler 5.06 update 7”组件包。可以到Keil官网的Legacy Support相关页面下载离线安装包,也可以直接在MDK的Pack Installer里搜索“ARM Compiler”在线安装。按我的经验,离线安装包最稳,在线安装偶尔会因为网络问题卡在“Downloading”界面半天不动。
安装时注意三个细节:
- 安装目标目录必须和MDK所在目录一致。比如MDK装在
C:\Keil_v5,安装组件时就要确保它写入C:\Keil_v5\ARM\ARMCC,不要让安装程序把它带到别的独立目录。 - 安装过程需要管理员权限。公司电脑开了UAC严格策略时,右键“以管理员身份运行”安装包是必要的。
- 装完之后完全退掉MDK再重新打开,因为编译器列表通常只在启动时扫描一次,不重启就看不到新装组件。
2.3 第三步:在MDK里指定编译器版本
重新打开工程后,进入:
Project -> Manage -> Project Items -> Folders/Extensions
在“ARM Compiler”下拉列表里,确认已经能看到版本5的条目,然后回到工程配置:
Options for Target -> Target -> ARM Compiler
在这里建议直接选择“ARM Compiler 5.06 update 7”,而不是保持默认。明确指定版本,后期排查问题时会非常方便——一看就知道当前用的是哪个编译器。
2.4 第四步:命令行验证AC5真的“复活”
安装完成后,为了不把希望全寄托在IDE图形界面上,我习惯打开命令行,切到C:\Keil_v5\ARM\ARMCC\bin,执行:
armcc --version如果输出里能看到类似“5.06 update 7”的版本号,说明编译器本体已经恢复正常。回到MDK重新编译,之前那个missing错误基本就消失了。
3. 装好AC5之后继续踩过的三个坑:从启动文件到分散加载
你以为到这就结束了?没有。AC5装回来看似简单,但在实际配置老工程的过程中,我又踩了三个很典型的坑。它们不一定会出现在每台机器上,但如果你遇到了,能少走不少弯路。
3.1 版本号对不上:5.06 update 6和update 7在MDK眼里是不同的东西
工程文件里记录的不只是“版本5”,还包含具体的update号。有些老工程明确写的是5.06update6,而你安装的是5.06update7。照理说这两个版本在二进制兼容性上没有差别,但MDK的检查机制比较死板,它发现工程请求的版本字符串和已安装组件的版本字符串不一致,依然会继续报missing。
解决方式有两个:
- 在工程配置里把编译器直接选成已安装的
5.06 update 7,绕开默认版本检查。 - 如果工程配置界面里就是不给选项,可以用记事本打开
.uvprojx,把里面“5.06update6”字样的字段全局替换成“5.06update7”。改之前先备份文件,这是老规矩了。
3.2 老工程里混进了AC6风格的启动文件和CMSIS头文件
这是我当时最头疼的问题。AC5装好之后,missing错误消失了,但编译时冒出一堆莫名其妙的警告,甚至有个别文件直接编译失败,报错风格完全不像armcc。最后排查发现,这个老工程在我接手前被人用AC6打开并保存过,工程里添加文件时误把AC6环境下的启动文件路径和CMSIS路径也带了进来。
AC5和AC6的启动文件(.s汇编文件)以及CMSIS系统头文件存在明显语法差异。AC5依赖cmsis_armcc.h,AC6依赖cmsis_armclang.h,一个工程里这两者绝对不要同时出现。
解决办法很简单:打开Options for Target -> C/C++ -> Include Paths,检查里面的路径指向的是ARMCC还是ARMCLANG,把混入的AC6路径彻底删除,只保留AC5对应的一组。如果启动文件也被换成了AC6版本,需要从老版本MDK的工程模板里找回原文件,或者从标准外设库的源码包里重新复制一份AC5版本启动文件。
3.3 分散加载文件(.scat)是AC5的“专属方言”
如果你用的是老式标准外设库工程,并且自己写过分散加载文件(Scatter File),要格外注意它的语法粒度。AC5对分散加载文件的某些标记接受度较宽松,AC6则严格得多,两者之间的小节定义方式也不完全相同。
如果你继续用AC5编译老工程,这一步基本不会出问题。但如果你试图新装MDK后直接把工程切到AC6来回避missing问题,却保留老.scat文件,链接阶段经常会遇到“region size overflow”或“load region execution address”之类的报错。这不是代码逻辑问题,纯粹是分散加载文件不兼容。
所以我的建议是:短期救急就用AC5继续跑,不要顺手去切换编译器;长期考虑迁移AC6的话,换成官方新风格的.sct分散加载文件是标配操作,这个我放到下一节细说。
4. 新工程用AC6,老工程用AC5:两条腿走路的编译器管理策略
解决完“编译器消失”的问题之后,我把新电脑上的开发环境定为“双编译器并存”:新项目一律用AC6,老项目继续用AC5,互不干预。这个策略用了快半年,一致很稳,也算是对AC5生命周期彻底进入维护期的理性应对。
4.1 为什么说AC5已经“进博物馆”但还是走不了
ARM官方对AC5的更新早已停止,最后一次正式版本就是5.06 update 7。按很多团队的逻辑,编译器停止更新就该赶紧迁移到AC6,但现实里还有一大批项目死活离不开它,我接触到的原因大致分三类:
第一类是历史存量产品维护。产品已经量产,测试数据、出货记录、安规认证全部基于某个固定的AC5版本编译产物,公司不会为了“换编译器”这件没有直接收益的事情承担风险。
第二类是老代码使用大量非标准语法。AC5对ARMCC风格的内联汇编、__forceinline、__attribute__等写法的容忍度比AC6宽松很多,AC6基于Clang架构,对语法要求严格得多,切过去之后要调整的不是一两行,而是几十个文件的规模。
第三类是第三方库没有新版本。很多DSP库、加密库、通信协议栈当年只提供了面向AC5的预编译库,库作者已经不再更新,没有AC6对应的.lib文件,想切也切不了。
4.2 真要迁移AC6,先把这四本账算清楚
如果你确实打算彻底摆脱AC5依赖,我建议先自查以下四个层面,全部确认过再动手,否则迁移过程比想象中痛苦很多。
- 启动文件:优先换成官方为AC6提供的
startup_armcmx.s新版本,不要沿用旧启动文件硬编。汇编本身的迁移工作量不大,但老版本启动文件常引用旧CMSIS头文件,容易把链路带断。 - CMSIS层:把
cmsis_armcc.h换成cmsis_armclang.h。这一步不做,后面所有外设寄存器读写代码都可能出现奇怪的编译错误,你可能连GPIOA->ODR这种标准操作都编不过。 - 内联汇编:把AC5风格的内联汇编改成标准GNU风格。AC6支持的是
__asm配合GNU汇编语法,与ARMCC的旧写法不完全一致,改起来是纯手工活,只能一个文件一个文件过。 - 告警等级:AC6默认告警比AC5严格得多,切过去后编译输出里会出现大量“unused variable”之类提示。建议先在Project配置里把告警等级调低,等迁移稳定后再逐步提上来。
我自己实际迁移过一个小型传感器采集工程,代码量大约一万行,只处理语法迁移和编译告警就花了两个周末。所以如果你只是临时解决“新电脑打不开老工程”的问题,把AC5组件装回来继续用,是完全合理且最省事的选择;迁移AC6的事,等有专门的编译验证预算再做。
4.3 适合直接写进团队文档的“编译器使用约定”
如果你的团队情况和我类似——新老电脑并存、有人装旧版MDK、有人装新版MDK、手头还有一堆老工程要维护——建议直接在共享文档里写明一条规则:
打开老工程之前,先确认当前机器的Keil MDK版本;如果高于5.37,首次编译前必须安装ARM Compiler 5.06 update 7组件,并在工程配置中手动指定AC5编译器,不要依赖默认值。
这个动作花不了十分钟,但能省掉一整天的排查时间。我就是把这条约定发给同事后,团队里再也没人半夜在群里问“为什么老工程编译不了了”。
另一个实用的小习惯是:给电脑做磁盘清理时,不要把C:\Keil_v5\ARM\ARMCC当成无用目录删掉。老工程指定的ACA5全家都在里面,删了就是让历史工程集体罢工。我见过不止一个同事因为用清理工具“优化”了C盘,第二天打不开所有老工程,最后只能翻安装包重新补装。
5. 最后的排查链路检查单:从报错出现到编译通过的全过程
为了方便你复现,我把整个排查过程整理成一份检查单,按顺序走一遍,基本能解决九成以上的missing问题。
- 重新编译老工程,确认报错信息是“missing: Compiler version 5”而不是其他编译错误。这个报错通常在Build Output窗口最上方。
- 打开
C:\Keil_v5\ARM目录,确认是否存在ARMCC文件夹。 - 如果不存在,从官方渠道下载并安装ARM Compiler 5.06 update 7,务必安装到与MDK相同的目录层级。
- 安装完成后重启MDK,在
Project -> Manage -> Project Items -> Folders/Extensions中确认能看到ARM Compiler 5.06 update 7条目。 - 回到
Options for Target -> Target,把编译器明确指定为已安装的AC5版本,不依赖默认。 - 执行一次
armcc --version命令行验证,确认编译器确实可执行。 - 如果编译中仍然报错,检查启动文件和CMSIS头文件路径是否混入了AC6版本的目录,必要时统一指向ARMCC。
- 如果还报分散加载文件相关错误,检查
.scat或.sct文件的语法,并确认其在AC5和当前MDK版本之间的兼容性。
这份检查单也直接对应了网络热搜里大家常问的那句“keil arm compiler 的 missing: compiler version 5编译不了”的来龙去脉。整体算下来,这类问题八成是没补装AC5组件,一成是路径被移动或清理工具误删,剩下的则是工程内部混用了两个编译器生态下的文件。
我个人现在的完整环境是:一台笔记本装MDK 5.39,Arm Compiler 5.06 update 7和最新版AC6并存,老工程用AC5,新工程用AC6,互相不碰。这套组合从三个月前配置好到现在,没有再出现过一次编译器缺失问题。如果你也正在被这个missing报错折腾,不用怀疑自己的工程坏了,把AC5组件装回来,再按上面第3节的操作验证一遍,八成就能恢复正常。
本文还有配套的精品资源,点击获取