news 2026/9/28 1:14:33

Keil 5.37下ARM Compiler 5缺失的完整安装与配置指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Keil 5.37下ARM Compiler 5缺失的完整安装与配置指南

升级到Keil 5.37之后,你是不是也遇到过这种情况:打开以前好好的工程,编译按钮直接罢工,Build Output窗口里跳出一行“Target 'Target 1' uses ARM-Compiler 'Default Compiler Version 5' which is not available”。我当时看到这行字的第一反应是工程文件坏了,第二反应是Keil安装出了问题,折腾了好一阵才反应过来——不是工程坏了,也不是Keil坏了,是5.37这个版本开始,ARM Compiler 5(也就是大家习惯叫的ARMCC,或者AC5)不再是默认安装的一部分了。

这篇文章就是专门来解决这个问题的。我会把这个报错的来龙去脉讲清楚,把网上搜了一堆也没人说明白的“ARMCC编译器去哪下载”“AC5怎么装回Keil 5.37”这些坑全部趟平,顺便把装好之后可能遇到的其他连锁问题(比如fromelf路径失效)一并列出来。无论你是刚升级、准备升级,还是已经卡在这个报错上几个小时了,照着下面的步骤走,都能把AC5装回去。

1. 报错前因:5.37把AC5“请出”了默认安装

1.1 这个报错到底在说什么

Keil的编译器下拉框里有一个选项叫“Default Compiler Version 5”,老用户应该很熟悉。它指的是让工程使用ARMCC工具链,也就是ARM Compiler 5,命令行工具对应的是armcc.exe、armasm.exe、armlink.exe、fromelf.exe这一整套。5.36及更早的MDK安装包会把ARMCC一起装进C:\Keil_v5\ARM\ARMCC\目录,你什么都不用管,打开工程直接编译,用的就是AC5。

但从MDK 5.37开始,Keil改变了打包策略:默认只带ARM Compiler 6(AC6,对应ARMCLANG工具链),ARMCC不再随安装包分发。于是问题就来了——你的工程文件(.uvprojx文件里的<pCCUsed>标签)里记录的还是AC5,但新装的Keil里根本没有这个编译器组件,系统只能报“not available”。

1.2 为什么Keil非要这么干

ARM官方早就宣布ARM Compiler 5进入维护模式(maintenance mode),不再增加新特性,只做关键bug修复,最后一个版本停在5.06 update 7(build 960)。而AC6基于LLVM/Clang架构,对C99、C11支持更好、编译速度更快、代码体积优化也更强,是官方认定的长期主力编译器。

站在ARM的角度,新版本捆绑AC6是理所当然的。但他们忽略了一件事:嵌入式行业里有海量的存量工程是用AC5写的,很多老型号的芯片SDK、ST的早期标准外设库、一些芯片厂商的底层驱动,在AC6下编译轻则warning刷屏,重则直接error。更别说很多老工程师写习惯了__asm内联汇编、__forceinline这些AC5风格的语法。所以不是大家不想用AC6,是项目和代码确实离不开AC5。

1.3 受影响最重的是这几类人

简单归纳,会被这个报错卡住的基本是三类:

  • 老工程维护者:工程是几年前创建的,一直用AC5编译,升级Keil后直接打不开工程编译。
  • 芯片SDK依赖者:有些芯片厂商的老版本SDK或驱动库只在AC5下验证过,换成AC6就会冒出一堆兼容性错误。
  • 有特殊语法依赖的开发者:代码里用了AC5特有的关键字、内联汇编写法、__attribute__的某些旧式用法,AC6不买账。

我遇到过最惨的情况是有人直接把整个SDK工程拷到新电脑,装好Keil 5.37后一编译就是成百上千行报错,最后发现根本不是代码问题,就是编译器没搭起来。

1.4 先别急着骂,确认两个基础信息

在往下操作之前,先确认两件事。第一,确认你的Keil版本确实是5.37或更高,打开Keil后菜单Help -> About查看版本号;第二,确认你当前的工程确实需要AC5,在魔术棒(Options for Target)-> Target页签的“ARM Compiler”下拉框里看选的是什么。如果显示“Default Compiler Version 5”或“Use default compiler version 5”,那你就来对地方了。

2. 先分清你是哪种翻车现场

我在排查这个问题的过程中发现,同样一句“Default Compiler Version 5 not available”,背后对应的场景其实不一样,解决方案也有细微差别。先花两分钟搞清楚自己属于哪种,能省不少事。

2.1 场景A:老版本升级上来的工程

这种情况最常见:你之前装的是Keil 5.36或更早版本,工程一直用AC5编译,某天手痒升级到了5.37(可能没卸载旧版,也可能直接覆盖安装),然后打开老工程,Build按钮点了没反应,或者弹窗提示编译器不可用。

这种场景的本质是:工程的编译器配置还在,但新装的环境里没有对应的编译器实体。升级时Keil不会自动帮你把AC5迁移过来,你原来C:\Keil_v5\ARM\ARMCC目录里的东西,要么被更新程序清掉了,要么被残留的旧版本挡住了。

2.2 场景B:全新安装后想用AC5

第二种情况是你在新电脑上或者刚格式化完系统,从官网下载了最新的Keil 5.37/5.38/5.39安装包,装完之后发现魔术棒里的编译器下拉框只有ARM Compiler 6,或者干脆连选都没得选。这时候你不是“遇到报错”,而是“发现AC5根本不存在”。

这种场景的本质是:安装包本身就没有包含AC5,你需要手动补装。别指望在Keil的安装目录里翻出隐藏的ARMCC文件夹,5.37之后的安装包真的没带。

2.3 怎么快速判断自己属于哪种

一个笨办法:看C:\Keil_v5\ARM\目录下有没有ARMCC文件夹。如果有ARMCC但编译还是报错,多半是路径配置或版本识别问题;如果连ARMCC文件夹都不存在,那就不用纠结了,直接看下一章去下载安装。

另一个判断点在报错时机:打开工程就报错,通常是工程文件里写死了编译器版本;点击编译才报错,通常是编译器检测环节没过。不管哪种,最终解法都一样——把AC5正确装回去,让Keil识别到。

2.4 顺手排除一个容易混淆的报错

如果你在Build Output里看到的是C9555E: Failed to check out license,这跟AC5缺失完全是两码事。那是License授权问题,多半是你没有安装对应的License或激活码过期。本文讲的Default Compiler Version 5 not available,关键字是“not available”(不可用),强调的是编译器组件不存在,不是授权问题。这个区别先记住,免得后面排查错方向。

3. 官方通道安装ARM Compiler 5.06 update 7

既然AC5已经被踢出了默认安装包,唯一正规的补装渠道就是ARM官网提供的ARM Compiler 5独立安装包。这个包官方一直在维护下载入口,哪怕AC5处于维护模式,也不影响下载和使用。

3.1 下载前需要准备的账号

ARM官网的东西现在基本都要登录账号才能下载。没有账号的先去注册一个,邮箱验证通过后登录。这一步没什么技术含量,但要注意:

  • 验证邮件有时候会被邮箱系统扔进垃圾箱,找不到了就去垃圾箱翻翻。
  • 如果用公司邮箱没收到,换个人邮箱(QQ邮箱、163邮箱等)成功率更高。
  • ARM的网站偶尔会抽风,页面加载慢或下载按钮点了没反应,刷新重试就行,别急。

3.2 找到正确的下载页面和安装包

搜索“Arm Compiler 5”或者直接进ARM官网的Downloads区域,找到“Arm Compiler 5.06 update 7”这个条目。注意版本号,很多人在这一步下错——只认5.06 update 7(build 960)这个版本,这是AC5的最后一个正式更新档,稳定性和兼容性都最好。

下载时选择对应操作系统的版本。Windows用户就下Windows版,一般是一个.zip或自解压的.exe文件,体积大概几百MB。别下成Linux或macOS版了,那是给服务器交叉编译用的,装到Windows上很麻烦。

3.3 安装路径的讲究

安装包拿到手后,双击安装。有一个细节我必须单独拎出来说:安装目录尽量不要乱改。ARM Compiler 5的默认安装路径和Keil的默认安装路径是有配套关系的,默认情况下它检测到Keil装在了C:\Keil_v5,就会自动把ARMCC放进C:\Keil_v5\ARM\ARMCC。如果你把Keil装在了D盘或自定义目录,安装AC5时就要手动把路径指到对应的D:\xxx\ARM\ARMCC(ARM目录下的ARMCC子目录)。

为什么要强调这个?因为后面Keil在识别编译器时,默认会在Keil安装目录的ARM子目录下找ARMCC文件夹。装错位置的话,Keil检测不到,前面白忙活。

安装过程没什么可选的,一路Next就行。装完后去C:\Keil_v5\ARM\ARMCC\bin目录看一眼,能看到armcc.exe、fromelf.exe、armlink.exe这些文件就说明核心组件到位了。

3.4 让Keil识别到AC5:Add another ARM Compiler Version

装完之后回到Keil,这时魔术棒(Options for Target)-> Target页签 -> “ARM Compiler”下拉框里应该能看到“ARM Compiler 5.06 update 7”了。如果没有,需要手动添加:

  1. 打开Keil,菜单栏选择 Project -> Manage -> Project Items。
  2. 切到“Folders/Extensions”页签。
  3. 找到“Add another ARM Compiler Version”区域,点击右侧的浏览按钮。
  4. 选择你的ARMCC目录,就是能看到bin子目录的那一层,比如C:\Keil_v5\ARM\ARMCC。
  5. 确认后,回到魔术棒里刷新一下下拉框,AC5就会出现了。

我见过某些网友分享的老教程会让你直接改TOOLS.INI配置文件来注册编译器路径,那种方法在5.37之后不太可靠,Keil的识别逻辑改过。老老实实用GUI里的“Add another ARM Compiler Version”按钮,这是最稳的。

3.5 验证安装是否成功

配置完成后,随便开一个以前用AC5编译的工程,或者新建一个最简单的空工程:

  • 在魔术棒 -> Target页签,把ARM Compiler下拉框选成“ARM Compiler 5.06 update 7”。
  • 点编译,看Build Output窗口的输出信息。
  • 正常的话会看到armcc开头的命令行输出,比如armcc -c --cpu Cortex-M3 -D__MICROLIB ...,说明AC5已经在干活了。

这样,最核心的问题就解决了。

4. 装上AC5之后仍然可能踩的三个暗坑

成功的喜悦先收一收。根据我的经历和你可能搜索到的“*** error: createprocess failed, command: 'c:\keil_v5\arm\armcc\bin\fromelf.”这类关键词,真正折磨人的往往在装上AC5之后。这里列三个高频暗坑,全部踩过之后再回头来感谢我不迟。

4.1 暗坑一:fromelf绝对路径失效导致的createprocess failed

这是我在解决这个问题时看到搜索热度最高的一个报错:*** error: createprocess failed, command: 'c:\keil_v5\arm\armcc\bin\fromelf.'。

这个报错的原因是这样的:很多老工程在“Options for Target -> User”页签里,配置了After Build/Rebuild的后续命令,用来调用fromelf.exe生成bin文件或反汇编文件。但你当年配置的时候,路径写死成了c:\keil_v5\arm\armcc\bin\fromelf.exe。如果:

  • 新电脑的Keil装了别的盘
  • AC5装到了非默认目录
  • 或者你从别人电脑上拷贝了ARMCC目录过来

那么Build阶段走得通,最后生成bin文件的阶段就挂在这儿了,弹出一句createprocess failed,看起来像是权限问题,其实根本原因是文件路径不存在。

解决方法是打开魔术棒 -> User页签,找到After Build/Rebuild下面的命令输入框,把fromelf相关的命令改成当前环境下的实际路径。更好的做法是改成相对路径或使用$K(Keil安装目录)变量,比如:

"$K$ARM\ARMCC\bin\fromelf.exe" --bin -o "$L@L.bin" "#L"

这样不管Keil装到什么盘,命令都能正确找到fromelf。

4.2 暗坑二:魔术棒里编译器下拉框还是“Default Compiler Version 5”

AC5装好之后,有些工程的魔术棒里显示的依然是“Default Compiler Version 5”,而且编译还是会报not available。这是因为工程文件里锁定了编译器版本,但新装AC5的版本标识和工程记录的不完全匹配。

这时候不要跟它死磕,直接把下拉框手动改成“ARM Compiler 5.06 update 7”就行。改完之后点OK,再重新编译一次。如果你希望以后所有工程都默认用AC5,可以在菜单Tools -> “Set Default Compiler Version”里设置默认编译器,不过Keil 5.37之后的版本这个入口找起来麻烦,最直接的办法还是每个工程手动指定。

4.3 暗坑三:AC5和AC6的代码兼容性问题被当成编译器缺失

还有一种情况是——你通过某种方式把AC5装回去了,编译也不报“not available”了,但冒出一堆语法错误、汇编错误,怀疑自己是不是装了个假的ARMCC。

其实不是假的,是这工程本来就是为AC5准备的,但在你升级的过程中,某些中间版本的Keil已经把工程默认编译选项悄悄切到AC6了,或者你新建文件时用了AC6的模板。此时你虽然选了AC5作为目标编译器,但部分源文件、启动文件里的写法在新旧工具链之间不兼容。典型表现:

  • 启动汇编文件(startup_xxx.s)里用了AC6不认识的伪操作。
  • 内联汇编写法不同,AC5用__asm { ... },AC6要求__asm(" ... ")字符串写法或新语法。
  • 分散加载文件(scatter file)里有些AC5时代的隐含规则,AC6下警告变错误。

这类问题就得靠改代码来解决了,不是装个编译器能绕过去的。我的建议是:如果你的项目核心代码依赖AC5特性,就锁死用AC5,别来回切换;如果新项目,优先试试AC6,有时候只是几个编译选项的问题,忍一忍过去的收益其实更大。

4.4 暗坑排查顺序一览

为了方便排查,我把装上AC5后可能遇到的报错和对应的处理思路整理成一张表:

报错或现象可能原因处理办法
魔术棒里没有AC5选项ARMCC没安装或路径未被识别用Project Items -> Folders/Extensions手动添加ARMCC目录
编译时还有not available工程锁定的编译器版本和已安装版本不匹配魔术棒里手动选“ARM Compiler 5.06 update 7”
createprocess failed + fromelfUser页签里的命令路径是旧机器/旧盘符的绝对路径改成$K$变量相对路径或当前实际路径
编译出现大量语法/汇编报错AC5/AC6工具链差异,或工程文件被切到AC6确认编译器锁定在AC5;必要时改代码兼容两边
编译通过但生成不了bin文件fromelf命令缺失或参数不对检查User页签的After Build命令,单独手动跑一遍fromelf验证

5. 从这次翻车里总结的几条实操经验

折腾完这一轮,有些亏吃了之后必须长记性。下面这几条既是对这次问题的复盘,也是给以后新装环境、团队协作时提个醒。

5.1 离线安装包一定要归档

ARM官网的下载入口还在,但这类“旧版本维护模式”的软件,说不准哪天入口就移动了、合并了,甚至需要额外审批了。我现在会把自己用的所有工具链安装包单独存一个目录,包括ARM Compiler 5.06 update 7安装包、各版本MDK安装包、常用芯片的Pack包,全部放在一个移动硬盘和网盘里各一份。装新电脑时,直接本地安装,再也不用受下载速度和网页跳转的气。

5.2 别信网上那些“拷贝大法”

看到有论坛帖子说,从装了AC5的电脑上把整个ARMCC文件夹拷过来,放到新电脑的C:\Keil_v5\ARM\下面就能用。我试过,结论是:部分场景能用,但极易翻车。ARMCC目录里有一些依赖系统注册表项和路径变量的组件,拷过来之后Keil未必能正确识别版本号,就算识别到了,fromelf等工具的路径也容易出问题。相比之下,官方安装包多花十分钟下完、装好,真的省心太多。

5.3 AC5和AC6谁能共存的策略

很多人以为装了AC5会顶掉AC6,其实不会。Keil 5.37及以后的版本完全支持AC5和AC6共存,C:\Keil_v5\ARM下会同时出现ARMCC和ARMCLANG两个目录,分别对应AC5和AC6。编译老工程时选AC5,编译新工程时选AC6,互不干扰。

我的建议是别急着全面拥抱AC6,也别死守AC5不放。老工程优化稳定就不要乱动,继续用AC5;新项目可以花点时间适应AC6,慢慢积累迁移经验。两条腿走路,项目才稳。

5.4 升级Keil前养成检查编译器选项的习惯

这次翻车给我的最大教训是:升级大版本IDE之前,先打开自己的主力工程看一眼编译器配置。如果用的是ARM Compiler 5,升级前就要确认新版Keil的配套AC5安装包已经准备好,或者干脆保留旧版本Keil不卸载。我还见过有人在升级后把老工程全部重新编译一遍“验证兼容性”,结果被一堆编译器差异的报错搞得心态爆炸。

5.5 在工程文件里留一条“编译器备忘”

一个团队里如果多个人维护同一套代码,建议在工程说明文档或者README里明确写上:“此工程使用ARM Compiler 5.06 update 7编译,安装新环境后需额外安装ARMCC。”这种一句话的备忘,能让后来的人少折腾好几个小时。我自己是直接把编译器版本信息写在*.uvprojx文件的注释区,或者放在git仓库的README开头。

6. 写在最后的个人体会

说到底,“Default Compiler Version 5 not available”这个报错本身并不复杂,复杂的是它牵扯出的工具链新旧交替、老项目存量维护、ARMCC和AC6语法差异这一连串问题。我这次处理完后复盘,最大的感受就是:做嵌入式的,别跟编译器版本过不去——该安装的组件老老实实装好,该锁定的版本老老实实锁死,能少很多无谓的折腾。

最后再分享一个有价值的小技巧:装好AC5后,可以顺手在命令行跑一次armcc --version,看到“Product: ARM Compiler 5.06 update 7”这样的信息,就说明你的AC5是完全可用的。以后但凡再遇到什么奇怪的编译报错,先跑这一句排查编译器状态,能帮你省下不少冤枉时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 1:14:33

Java后端+微信小程序地图定位项目源码解析与实战避坑

简介&#xff1a;这份资源是面向Java后端开发者与小程序入门者的实战项目包&#xff0c;围绕「小程序地图定位」这一常见需求&#xff0c;演示如何用Java服务端配合前端完成位置服务。内容涉及GPS与网络定位、地理编码与反地理编码、路径规划、定位数据实时更新、隐私安全处理以…

作者头像 李华
网站建设 2026/9/28 1:12:28

基于YOLOv8-Pose与LSTM的摔倒检测实战:从数据到部署的误报优化指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 1:11:52

签名检测数据集训练YOLOv8:从数据体检到高召回率实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 1:11:46

多相机拼接实战:VisionMaster标定与无缝拼接全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 1:11:26

C#银行管理系统实战:ADO.NET事务与SQL Server LocalDB部署

简介&#xff1a;本资源是一份面向计算机专业本科生与C#初学者的课程设计实践项目&#xff0c;聚焦银行管理系统开发全流程&#xff0c;涵盖C#桌面应用开发、SQL Server数据库设计与交互、Windows Forms界面实现及软件工程规范实践。压缩包共179个文件&#xff0c;含66个C#源码…

作者头像 李华
网站建设 2026/9/28 1:11:17

SpringBoot家政预约系统实战:并发控制、数据库设计与部署

每年都有大量家政公司被预约管理搞得焦头烂额&#xff1a;客户电话一个接一个&#xff0c;阿姨排班全靠Excel&#xff0c;时间撞车只能人工协调&#xff0c;月底对账更是噩梦。去年我接了一个家政公司的单子&#xff0c;核心诉求就是做一个家政保洁预约管理系统&#xff0c;让客…

作者头像 李华