升级到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”了。如果没有,需要手动添加:
- 打开Keil,菜单栏选择 Project -> Manage -> Project Items。
- 切到“Folders/Extensions”页签。
- 找到“Add another ARM Compiler Version”区域,点击右侧的浏览按钮。
- 选择你的ARMCC目录,就是能看到
bin子目录的那一层,比如C:\Keil_v5\ARM\ARMCC。 - 确认后,回到魔术棒里刷新一下下拉框,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 + fromelf | User页签里的命令路径是旧机器/旧盘符的绝对路径 | 改成$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是完全可用的。以后但凡再遇到什么奇怪的编译报错,先跑这一句排查编译器状态,能帮你省下不少冤枉时间。