ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Keil MDK报错missing Compiler version 5?一文教你找回ARM编译器AC5

Keil MDK报错missing Compiler version 5?一文教你找回ARM编译器AC5 简介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系列AC6armclang。所以“missing: Compiler version 5”翻译一下就是工程文件点名要AC5但MDK扫描了一圈发现没装。这篇文章我就按自己实际解决这个问题的完整过程来写从报错原理、装机步骤、验证方法到后续要不要迁移AC6一次说透。不管你是刚接手老项目的实习生还是被存量固件困住的老工程师照着操作就能把编译环境救回来。1. 编译器版本5为什么会“凭空消失”Keil查找逻辑与文件目录结构要回答这个问题得先看一下两款编译器在硬盘上的真实位置以及MDK是怎么知道“系统里有哪几个编译器”的。1.1 两款编译器在你硬盘上分别住在哪里以最常见的默认安装路径C:\Keil_v5为例。如果你装的是带AC5的旧版MDK比如5.36及更早打开C:\Keil_v5\ARM目录会看到两个关键子文件夹ARMCCAC5的安装位置可执行文件叫armcc.exeARMCLANGAC6的安装位置可执行文件叫armclang.exe如果你用的是MDK 5.37及以上版本并且安装时没有额外勾选旧版本兼容组件那么在C:\Keil_v5\ARM下很可能只有ARMCLANG没有ARMCC。这个ARMCC目录不存在MDK自然找不到AC5于是工程一编译就报missing。一个容易被忽略的事实是AC5并没有被官方“消灭”它只是不再默认安装而已。你完全可以把它单独装回来装好之后继续配合新版MDK使用两个编译器版本可以在同一个IDE里并存互相不干扰。1.2 工程文件里那行不显眼的“编译器ID”记录Keil工程文件.uvprojx本质上是个XML文本文件。用记事本打开老工程翻到和编译器相关的区域通常能看到类似这样的内容uAC51/uAC5 TargetArmAds ArmAdsMisc useUlib1/useUlib WarningLevel3/WarningLevel /ArmAdsMisc /TargetArmAds其中uAC5这个标签为1就表示整个Target在创建时被设定为使用AC5编译器。MDK加载工程时读到这个标记就会去“编译器注册表”里查有没有对应可执行程序查不到就把曾经正常工作的工程标记为编译不可用。这也解释了另一个常见现象你可以正常打开一个新建的AC6工程但同一个源码文件夹里的老工程却报missing。因为两个工程文件里请求的编译器不同当前环境只满足其中一方。1.3 TOOLS.INIMDK的编译器“户口本”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.hAC6依赖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.39Arm Compiler 5.06 update 7和最新版AC6并存老工程用AC5新工程用AC6互相不碰。这套组合从三个月前配置好到现在没有再出现过一次编译器缺失问题。如果你也正在被这个missing报错折腾不用怀疑自己的工程坏了把AC5组件装回来再按上面第3节的操作验证一遍八成就能恢复正常。本文还有配套的精品资源点击获取
返回列表