你有没有遇到过这种场景:从同事那边拷来一个Keil5工程,双击.uvprojx文件,工程正常打开了,芯片型号、Flash 下载算法、调试器配置全都好好的,结果你满怀信心地按下 Build 按钮,编译输出窗口直接给你来了一行红色错误——Target uses ARM-Compiler 'Arm Compiler 5.06' which is not available。
这个“找不到 ARM Compiler 5.06”的问题,在嵌入式开发圈里太常见了。尤其是从 MDK 5.37 版本开始,Keil 默认不再随安装包分发 AC5 编译器,很多老工程、芯片原厂 SDK、或者团队内部沿用多年的工程模板,打开后编译器一栏直接是空的,编译根本没法进行。这篇文章我就把从安装到配置的完整流程捋一遍,结合我实际踩过的坑,帮你一次性解决这个问题。
1. 先搞清楚为什么会“找不到”
1.1 从 MDK 5.37 开始,AC5 变成了“隐藏模式”
很多人误以为“找不到编译器”是自己操作错了,其实不是。从 MDK 5.37 开始,Arm 官方将 ARM Compiler 5 标记为 legacy(遗留版本),新装 Keil5 时默认只安装 ARM Compiler 6(也就是基于 LLVM/Clang 的 armclang)。官方不再把 AC5 默认塞进安装目录,你需要手动安装和注册。
这就带来一个很现实的问题:很多在 2018 年、2019 年甚至更早创建的工程,工程文件里记录的编译器版本就是 AC5。你用新版本 Keil 打开这些工程时,Keil 按照工程配置去找 AC5,结果发现电脑上根本没装,于是直接报错。不是说 Keil 不支持 AC5,而是它不再默认帮你装好了。
另外还有一类情况也容易踩中:有些人电脑上之前装的是旧版 Keil(比如 MDK 5.36),AC5 是有的。后来为了用新芯片包,升级到了 MDK 5.38 或更高版本,升级过程中旧编译器被清理掉,工程再打开就“找不到”了。
1.2 AC5 和 AC6 的核心差异,决定了老工程没法直接用 AC6 编译
可能有人会问:那我不装 AC5 了,直接把工程切到 AC6 编译行不行?理论上可以,但实操中通常会一地鸡毛。
AC5 的编译器叫armcc,AC6 的编译器叫armclang。这两个编译器虽然在 Keil 的图形界面里只是下拉框换一个选项,但底层编译器的差异非常大。AC6 的 C 标准支持更激进,默认情况下对类型检查更严格,内联汇编语法完全不一样,__attribute__和#pragma的解析方式也有很大差别。
举几个我实际遇到过的问题:
- 老工程大量使用的
__forceinline,在 AC6 下不认识,得改成__attribute__((always_inline))。 - 结构体对齐和位域的处理逻辑不一样,同一个结构体,AC5 和 AC6 算出来的
sizeof可能不同。 - AC6 对未使用的变量、隐式类型转换警告更严,老工程的代码一编译就是几百条 warning,甚至升级成 error。
- 芯片厂商的启动文件、底层库如果只针对 AC5 做了适配,用 AC6 编译会出现
.s文件汇编不过去的情况。
所以,如果你维护的是成熟老工程,最稳妥的方案就是老老实实把 AC5.06 装回来,让工程保持原样编译。
1.3 哪些情况最容易触发“找不到编译器”报错
根据我这些年帮别人排查的经验,常见触发场景基本就这几类:
- 新装了 MDK 5.37 及以上版本,然后打开老工程。
- 电脑重装或者更换新电脑,只拷贝了工程文件夹,没有把 Keil 整个安装目录带过来。
- 从旧 Keil 升级到新 Keil,升级过程覆盖了旧的
ARM\ARMCC目录。 - 使用的是 C51 版本的 Keil(用于 8051 单片机),结果拿它打开 MDK 的 ARM 工程,编译器列表自然完全对不上。
- 工程文件本身是只读的,或者存放在中文路径、网盘同步目录下,Keil 读到了工程配置但没法正确加载编译器。
搞清楚这些之后,下面就好办了。先说准备工作,再说怎么装。
2. 安装前的准备:版本确认与安装包获取
2.1 确认你的 Keil 版本和安装路径
这一步虽然简单,但我建议你花 30 秒做一下,后面能省掉很多麻烦。
打开 Keil uVision,菜单栏选择 Help -> About uVision,弹窗里会显示当前 MDK 版本号,比如µVision V5.38.0.0。如果你用的是 MDK 5.37 及以上版本,那几乎可以确定问题就是 AC5 没有安装导致的。
同时留意 uVision 安装路径。默认情况下是C:\Keil_v5,但有些同行会把 Keil 装在 D 盘或者其他盘。记下这个路径,后面配置编译器时要指过去。这里顺便说一句:Keil 安装路径千万不要带中文字符,也不要带空格,否则很多工具链组件会出现各种莫名其妙的问题。我见过有人装在D:\开发工具\Keil_v5,结果 AC5 怎么配都识别不了,改回纯英文路径后一切正常。
2.2 获取 ARM Compiler 5.06 安装包的三种途径
ARM Compiler 5.06 的常见版本是5.06 update 7 (build 960),这也是我推荐大家使用的版本。它的兼容性和稳定性在 AC5 系列里算是比较好的,网上的资源也最多。获取方式有三种:
第一种,Arm 官网下载独立安装程序。打开 Arm 官网,搜索 “ARM Compiler 5.06 for Keil” 或者进入 Downloads 页面找 Legacy ARM Compiler 5 的入口,下载 Windows 版本。这个安装包一般一两百 MB,下载完成后直接运行安装程序即可。优点是安装干净、版本可控,缺点是官网下载速度有时候不太理想,而且个别时候页面入口藏得比较深。
第二种,通过 Keil 自带的 Pack Installer 在线安装。这也是我最推荐的方式,因为不需要另外找资源,打开 Pack Installer 搜索5.06就有对应条目,点 Install 就会自动下载安装。缺点是 Pack Installer 的服务器在国外,网络不好时容易失败。
第三种,从同事或旧电脑上直接拷贝 ARMCC 目录。这是离线环境下最实用的土办法,后面我会详细讲目录结构,只要文件完整,效果和正规安装没区别。
2.3 版本号别搞混:5.06u7 就是这个
下载安装包的时候,有人会纠结版本号。ARM Compiler 5.06 update 7 (build 960) 在 Keil 的 Pack Installer 里会显示成ARM Compiler 5.06u7,有时候写5.06 update 7,说法不同,但都是同一个东西。
我不建议去下载什么 5.06 update 5、5.06 update 6 之类的老版本,除非你公司内部统一强制使用某个特定版本。大多数情况下,直接选 update 7 是最省心的,它能向下兼容绝大多数老工程。
3. 安装 ARM Compiler 5.06 实操
3.1 方法一:Pack Installer 图形化安装(网络正常时首选)
步骤很简单:
- 打开 Keil uVision,点击工具栏上的 Pack Installer 按钮,或者通过菜单 Project -> Manage -> Pack Installer 打开。
- 在 Pack Installer 窗口左侧找到
Packs页签,右上角搜索框输入ARM Compiler 5.06或者直接搜5.06。 - 在搜索结果里找到 ARM Compiler 5.06u7 对应的条目,点击右侧的 Install 按钮。
- 等待下载安装。安装过程会下载编译器的压缩包并自动解压到 Keil 的 ARM 目录下,完成后条目会出现在已安装列表中。
这里要提醒一下:Pack Installer 的下载速度很大程度上取决于你所在网络的国际带宽。如果安装了老半天进度条都不动,或者直接报下载失败,别硬等,果断切到方法二。我在公司遇到过很多次,同一个 Pack Installer,家里一次性成功,公司网络死活下不动,换手动拷贝马上解决。
3.2 方法二:独立安装包安装
如果你从官网下载的是独立安装程序,那就更简单了。双击运行,安装过程中会让你选择安装目录,这里有个关键操作:把安装路径指向你 Keil 安装目录下的ARM子目录。
举个例子,如果你的 Keil 安装在D:\Keil_v5,那安装程序的目标路径就填D:\Keil_v5\ARM。这样安装完成后,编译器会出现在D:\Keil_v5\ARM\ARMCC目录下,Keil 能直接识别。
如果你装的时候默认路径不对,装到了C:\Program Files\ARM之类的地方,也别慌,后面配置的时候把路径指过去就行,只是每次维护麻烦一点。最好还是装到 Keil 的 ARM 目录下,让整个工具链集中管理。
3.3 方法三:离线拷贝 ARMCC 目录(最实用)
这个方法算是嵌入式圈子里的“传承手艺”了。不夸张地说,我自己的 U 盘里常年备份着一个 ARMCC 文件夹,就是用来应急的。
操作分三步:
第一步,找一台已经装好 AC5 且能正常编译的电脑,进入它的 Keil 安装目录,比如C:\Keil_v5\ARM,把整个ARMCC文件夹复制出来。
第二步,把ARMCC文件夹拷贝到目标电脑的 Keil 安装目录下。如果你的 Keil 装在D:\Keil_v5,那么拷贝后的路径应该是D:\Keil_v5\ARM\ARMCC。
第三步,检查目录结构是否正确。核心是要确保armcc.exe在ARMCC\bin子目录下面。一个正常的 AC5.06u7 目录结构大概是这样的:
D:\Keil_v5\ARM\ARMCC │ └───bin ├── armcc.exe ├── armclang.exe ├── armlink.exe ├── armasm.exe └── ...看到armcc.exe和armclang.exe同时存在就对了。AC5 虽然是老编译器,但 5.06u7 这个版本内部也带了 ARMClang 的组件,两者共存是正常的,不要觉得奇怪。
这里要特别强调一下:网上有些精简版 ARMCC 压缩包只有armcc.exe而没有完整的 include 目录、lib 目录,这种包后续编译会出各种诡异问题。完整的 ARMCC 目录除了 bin,还应该有 include、lib、doc 等子目录,拷贝的时候一定要整个文件夹一起拷。
3.4 安装完成后的自检:命令行验证
装好之后,建议先做一次“冒烟测试”,确认编译器本体没问题,再打开 Keil 折腾配置。
打开命令行窗口(Win+R 输入 cmd),切换到 ARMCC 的 bin 目录,执行:
cd /d D:\Keil_v5\ARM\ARMCC\bin armcc --version如果输出类似ARM Compiler 5.06 update 7 (build 960)的版本信息,说明编译器可执行文件本身没问题。这一步能帮你区分“编译器没装好”和“Keil 没识别到”这两类不同的问题。命令行都不显示版本,那就先别去 Keil 里找原因了,先把编译器弄好吧。
4. Keil 工程配置:让 Keil5 认准 AC5.06
4.1 将编译器添加到 Keil 的识别列表
安装完成后,还需要让 Keil 在“编译器管理器”里注册这个编译器。这一步是最容易出错的地方,很多人在网上找了一圈方法,最后发现就是卡在这一步。
操作路径:点击菜单栏 Project -> Manage -> Project Items,在弹出的窗口里切换到Folders/Extensions页签。
往下找,会看到一个ARM Compiler相关的区域。在这个区域里有一个输入框和Add another ARM Compiler Version之类的按钮。在输入框里填入ARMCC\bin目录的完整路径,也就是D:\Keil_v5\ARM\ARMCC\bin这种形式,然后点击添加。
添加成功后,下方的列表里会出现一个条目,显示类似ARM Compiler 5.06u7的版本信息。如果你之前装过 AC6,这个列表里会同时出现 AC6 的多个版本,这是正常的。Keil 会扫描你指定的所有目录,把能找到的编译器都列出来。
确认列表里能看到 5.06u7 后,点 OK 保存。
这里有个血泪教训:填路径的时候,一定要填到bin这一级,不是填到ARMCC,更不是填到D:\Keil_v5。Keil 是通过识别 bin 目录下的armcc.exe来确定编译器的。填错了,Keil 扫描不到任何东西,等于白配。
4.2 给当前工程指定编译器版本
注册完编译器之后,打开你的目标工程,点击魔术棒Options for Target,进入Target页签。
在最上方会有一个ARM Compiler下拉框,默认可能是Use default compiler version 6或者Use default compiler version 5。你需要手动选择刚才注册好的ARM Compiler 5.06u7。
这里有两个选择思路:
- 如果你希望当前工程固定用 AC5.06u7,那就直接在下拉框里选
ARM Compiler 5.06u7。 - 如果你希望 Keil 根据工程文件里的旧配置自动选择 AC5,可以选
Use default compiler version 5,前提是工程文件里记录的编译器就是 AC5。
选好之后,点 OK 保存设置,然后重新编译一次。看到 Build Output 窗口里出现armcc开头的编译命令,或者顶部显示Compiler: ARM Compiler 5.06u7,就说明配置成功了。
4.3 容易被忽略的细节
在实际操作中,有几个细节特别影响体验,我单独拎出来说一下。
第一,改了配置后如果编译还是报错,先把工程关掉再重新打开一次。Keil 在工程加载时会快照编译器配置,有时候你改了设置但配置文件没重新加载,关掉重开能解决很多“改了等于没改”的假象。
第二,Folders/Extensions页签里列出的编译器,如果某个条目显示灰色或者带感叹号,说明那个路径失效了。把这个失效条目删掉,再重新添加正确的路径。
第三,如果你同时装了 C51 和 MDK 两个版本(现在很多人在 Keil5 下兼容 C51 和 STM32 开发),注意确认你打开工程用的是 MDK 的 uVision,不是 C51 的。最直观的判断方法:C51 版本打开工程后,工具栏上的芯片型号通常显示不出 ARM 芯片,或者编译选项里根本没有 ARM Compiler 这个概念。
4.4 配置完成后,顺手检查这几处
我每次配置完 AC5 后,还会顺手检查这三个地方,防止旧工程还有其他坑:
- 在
C/C++页签里,确认一下是否勾选了C99 Mode。很多老工程用 AC5 编译时默认开着 C99,如果没勾选,代码里一些 C99 语法会报错,容易被误认为是编译器没配好。 - 在
Target页签的Code Generation区域,确认编译器相关选项没有异常。个别工程模板会在这里勾选奇怪的选项,导致编译行为异常。 - 检查
Debug页签里的调试器设置。编译器切换不影响调试器配置,但如果你之前用 AC6 编译过这个工程,这会儿切到 AC5,最好先把工程重新编译一遍再进调试,避免固件和调试信息不一致。
5. 常见问题与排查技巧实录
5.1 编译报错:Target uses ARM-Compiler 'Arm Compiler 5.06' which is not available
这是最经典的一条报错,基本可以翻译为:Keil 检查到你当前工程需要 AC5,但你的电脑上没有可用的 AC5 编译器。
排查顺序很固定:
- 先按 4.1 的步骤,确认
Folders/Extensions里已经添加了ARMCC\bin路径,并且列表里出现了 5.06u7。 - 打开当前工程的
Options for Target -> Target,确认 ARM Compiler 下拉框确实选了 AC5,而不是停在Use default compiler version 6。 - 确认 Keil 安装路径和工程路径都没有中文字符。
- 关掉工程重新打开,或者直接重启 Keil,再编译一次。
如果以上四步都做完了还报错,那就用手动拷贝的方式再装一遍 ARMCC 目录,然后用 3.4 的命令行验证armcc --version能正常输出。绝大多数情况下,问题出在 ARMCC 目录本身不完整,或者路径没指到 bin。
5.2 编译器下拉框是灰色的,点不了
这个情况我也遇到过,而且很容易让人懵。Options for Target -> Target页签的 ARM Compiler 下拉框是灰色的,无法选择。
原因一般是两个:
一个原因是当前 Keil 工具链类型不对。比如你打开的是一个 MDK 的 ARM 工程,但实际使用的是 C51 版本的 uVision。C51 版本根本没有 ARM Compiler 这个概念,下拉框自然不可用。这种情况请去安装 MDK 版本的 Keil。
另一个原因是Folders/Extensions的编译器列表为空,Keil 找不到任何已注册的 ARM 编译器,所以下拉框直接置灰。去按照 4.1 的步骤添加 ARMCC 的路径,下拉框就会恢复正常。
5.3 Pack Installer 显示安装成功,但 Keil 还是找不到
这个坑我帮好几个同事排过。Pack Installer 界面上显示 ARM Compiler 5.06u7 已经安装成功,但打开工程后 Keil 还是报找不到编译器。
排查思路是这样的:先到安装目录下看ARMCC文件夹是否存在。如果不存在,说明 Pack Installer 可能把编译器装到了别的公共目录。这时候你可以先打开命令行,执行where armcc看看系统能不能找到,找到后把对应的 bin 路径手动添加到Folders/Extensions里。
如果 ARMCC 目录确实存在,但 Keil 识别不了,我一般会直接恢复默认配置:在Folders/Extensions页签把原来的所有编译器条目删掉,重新添加ARMCC\bin和 AC6 的路径,再重启 Keil。这个方法大多数时候能解决“识别不到已安装编译器”的问题。
5.4 其他高频问题速查
我把实际工作中碰到过的一些问题整理成了表格,方便你直接对照排查。
| 现象 | 原因 | 解决方法 |
|---|---|---|
| 编译报错:Target uses ARM-Compiler 5.06 which is not available | Keil 未注册 AC5 编译器 | 在 Folders/Extensions 中添加 ARMCC\bin 路径 |
| ARM Compiler 下拉框灰色 | 未安装 MDK 版本,或编译器列表为空 | 切换到 MDK 版 Keil,添加编译器路径 |
| Pack Installer 安装后仍找不到 | 编译器安装目录不在 Keil 识别范围内 | 手动将 ARMCC 目录拷贝到 Keil\ARM 下再注册 |
| 编译后大量 typedef 冲突或语法错误 | 老工程语法偏 AC5,误用了 AC6 | 在 Options for Target 中切换回 AC5.06u7 |
| 提示环境变量 Path 有 Keil 相关内容 | 之前安装过其他版本的 Arm 工具链 | 无需过度处理,确认 ARMCC 路径有效即可 |
| 报错无法打开 GPDSC 文件或 Pack 加载失败 | 芯片包版本和 Keil 版本不匹配 | 在 Pack Installer 中升级或降级对应芯片包版本 |
5.5 一些避坑经验
这里分享几个我压箱底的经验,都是常规教程里不会写的东西。
第一,ARMCC 目录一定要做备份。AC5.06 已经成为遗留版本,以后的新版 Keil 只会越来越不待见它,官方下载通道也可能哪天突然关闭。把ARMCC文件夹整个压缩,放在网盘或者 U 盘里,换电脑、重装系统后直接解压就能用,省去所有下载和安装的麻烦。我现在给团队新人的入职机器装 Keil,从来不联网下载 AC5,就是直接拷备份。
第二,如果你维护的工程文件被放在共享目录、网盘同步目录或者加了只读属性,Keil 有时会出现“配置改了但保存不了”的诡异现象。表现就是你明明选了 AC5.06u7,关掉工程重新打开又变回默认。这种时候把工程文件先复制到本地磁盘,去掉只读属性,配置好之后再同步回去。
第三,遇到编译器相关报错,第一反应不要是重装 Keil。重装是大招,但耗时且容易引入新的配置问题。最优先的操作永远是:检查Folders/Extensions里的编译器列表,检查工程 Target 页签的编译器选择,检查 ARMCC 目录是否完整。90% 的情况都出在这三个地方。
第四,如果你确实想从 AC5 迁移到 AC6,别一次把整个工程切过去。先建一个分支,把编译器的 warning 级别调到最高,把所有警告修完,再逐步替换内联汇编和编译器特性相关代码。坦白讲,这个过程可能比你想的要长,但好处是以后不再依赖已经进入遗留状态的 AC5。
写在最后:我的一点实际体会
做嵌入式开发这么多年,AC5 给我留下的印象是“又老又稳”。说它老,是因为它背后的技术体系确实有年头了;说它稳,是因为大量量产项目的代码都在它上面跑了好几年,编译器行为和代码优化特性早就被摸透了。这也是为什么即使到了今天,ARM Compiler 5.06 update 7 依旧是很多老工程师装机必备的工具链组件。
我个人在实际操作中的体会是:AC5 的安装配置本质就是“目录 + 注册”两件事,目录对了,注册对了,Keil 就能稳定识别。整个过程一旦走通,几乎是一劳永逸的。真正的坑往往藏在细节里,比如路径带中文、填路径时少了一层 bin、包不完整、用错了 C51 版本,这些才是让人卡住半天甚至一天的元凶。
最后再分享一个小技巧:装好 AC5.06u7 并验证编译通过之后,我建议你马上做两件事。第一件,把ARMCC目录打包备份好;第二件,在便签里记一下你配置时填写的bin路径。这样以后不管是换电脑还是重装系统,照着这个过程重新走一遍,最多十分钟就能恢复到你熟悉的开发环境。