ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Keil5找不到ARM Compiler 5.06?从安装到配置一次性解决AC5报错

Keil5找不到ARM Compiler 5.06?从安装到配置一次性解决AC5报错 你有没有遇到过这种场景从同事那边拷来一个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.36AC5 是有的。后来为了用新芯片包升级到了 MDK 5.38 或更高版本升级过程中旧编译器被清理掉工程再打开就“找不到”了。1.2 AC5 和 AC6 的核心差异决定了老工程没法直接用 AC6 编译可能有人会问那我不装 AC5 了直接把工程切到 AC6 编译行不行理论上可以但实操中通常会一地鸡毛。AC5 的编译器叫armccAC6 的编译器叫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 折腾配置。打开命令行窗口WinR 输入 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.064.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 availableKeil 未注册 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路径。这样以后不管是换电脑还是重装系统照着这个过程重新走一遍最多十分钟就能恢复到你熟悉的开发环境。
返回列表