ARTICLE DETAIL

资讯详情

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

Keil MDK报错:ARM Compiler 5缺失的安装与切换完整指南

Keil MDK报错:ARM Compiler 5缺失的安装与切换完整指南 做嵌入式开发尤其是碰 Keil MDK 的兄弟这几年估计没少被编译器版本折腾过。我最近就碰到一个非常典型的报错编译时直接弹出来*** target project uses arm-compiler default compiler version 5 which is not available.这句报错翻译过来就是你的工程指定要使用 AC5ARM Compiler 5也就是默认编译器版本 5但是当前环境里根本没有这个编译器。我当时的 MDK 版本是 5.37从网上把 ARM_Compiler_5 补装上去之后问题才彻底解决。这篇文章我就把这个问题的根因、补装步骤、切换细节和避坑经验完整写一遍方便遇到同样报错的朋友少走弯路。这个报错多见于三种场景一是你刚装了新版 MDK然后被要求编译一个老项目二是团队里有人把工程从 AC5 换到了 AC6但工程配置文件还残留着 AC5 的标记三是你明明记得自己装了 AC5但 MDK 的安装路径或环境变量乱了导致工具链没被识别。整个过程不复杂但如果你没搞懂“编译器安装”和“工程选项”这两层逻辑很容易装完还是报错。1. 错误全貌这个报错到底在说什么先说结论这句话不是 MDK 崩了而是 MDK 的编译器抽象层在抱怨“你需要的编译器不存在”。Keil MDK 从 5.36 左右开始把 AC5 和 AC6 分开管理AC5 不再是默认自带的组件而是作为一个可选安装包出现。如果你的工程文件.uvprojx里记录的是 AC5而当前 MDK 里没有注册 AC5 工具链编译时就会输出这段提示。1.1 报错里每个关键字拆开看target不用多说就是指你当前激活的编译目标。default compiler version 5指的是工程选项里的编译器版本设置。在 Keil 里你打开“Options for Target”对话框切到“Target”标签页右下角会有个“ARM Compiler”下拉框。如果你选择的是“Use default compiler version 5”MDK 就会去找 AC5。not available则是诊断的核心。MDK 在启动编译时会扫描自己注册的编译器列表如果发现当前工程要求的版本没被注册就直接拒绝编译而不是自动给你换一个编译器。这个设计其实挺合理的因为 AC5 和 AC6 的语法、优化方式、内置宏定义都有差异强行替换可能导致代码行为变化。1.2 为什么这个报错这么常见我身边遇到这个报错的人几乎都是被“新装的 MDK 不等于带全编译器”这个认知坑了。MDK 从某个版本开始安装包里默认只带 AC6AC5 需要额外下载。很多老工程、芯片厂商的示例代码、客户交接的代码包都是基于 AC5 写的。两下一碰面自然就爆出 not available。另外还有一个容易被忽略的点有一些国产芯片厂商的 SDK 向导工具生成的工程默认就是 AC5。比如你用的是某 ARM Cortex-M0 或者老一点的 M3 内核芯片厂商模板里经常写着-fno-short-enums这类 AC5 才常用的编译选项。这时候你不但要装 AC5可能还要核对一下工程里的编译选项有没有被 MDK 自动改掉。2. 为什么新版 MDK 默认不带 AC5Arm 在 2018 年左右就主推 AC6它是基于 LLVM 的编译器语法更接近 Clang/GCC对 C99、C11 的支持也比老旧的 AC5 好。Keil MDK 为了跟 Arm 的步调一致从 5.36、5.37 这几版开始安装包就不再附带 AC5。但嵌入式这个行业什么最值钱兼容性最值钱。大批量还在量产的代码、经过认证的固件库、基于 AC5 优化技巧调过的性能关键函数不是说换就能换的。2.1 AC5 和 AC6 到底差在哪AC5 是经典的 armcc对很多嵌入式老开发者来说它意味着小端/大端切换直观__forceinline这类关键字支持好编译速度快内存占用低对旧编译器版本生成的库文件兼容性好而 AC6 的 armclang 则带来了更好的 C99/C11 支持甚至部分 C 特性优化能力更强诊断信息更清晰问题是AC6 对代码的规范性要求更高。有些在老编译器下能通过的错误代码在 AC6 下直接报 error。比如 AC5 允许函数声明后面不加voidAC6 可能会给警告或错误AC5 支持__irq关键字AC6 要求你改成__attribute__((interrupt))或者用 CMSIS 里的定义。2.2 MDK 5.37 的安装策略我当时从官网下载 MDK 5.37 的安装包静静看着它装完打开工程就遇到这个报错第一反应是重启大法没用。后来才意识到新版 MDK 的安装组件页面里默认是不勾选 AC5 的。你必须在安装的时候或者后续打开 Pack Installer 的编译器标签页手动去下载安装。如果你跟当初的我一样安装时一路 Next 根本没细看组件列表就会有这个隐患。3. 下载 ARM Compiler 5 并安装到 Keil MDK解决这个报错的正路就是补装 ARM_Compiler_5。3.1 去哪里下载最靠谱的来源就是 Keil 官方的 Pack Installer。打开 MDK点击工具栏上的“Pack Installer”图标一个绿色方块的图标界面上方有“Compiler”标签页。点进去就能看到 ARM Compiler 5 和 ARM Compiler 6 的可选版本找到你需要的那一版比如 5.06 update 7这版是 AC5 里比较成熟的版本点 InstallKeil 会自动下载并安装。如果你用的是偏门版本比如某些国产 IDE 魔改的 MDKPack Installer 可能连不上服务器。这时候可以去 Keil 官网的“MDK-ARM Compiler”下载页面手动下载。完整的软件包名一般是ARMCompiler 5.06 update 7 (build 960) Windows 版安装包注意新版的 MDK 5.37 是支持 AC5 5.06 的装完会自动识别。3.2 安装时的注意事项安装 AC5 的时候它默认会往 MDK 安装目录下的ARM\ARMCC文件夹里放文件。比如我的 MDK 在D:\Keil_v5那编译器就会在D:\Keil_v5\ARM\ARMCC。这里有个坑不同版本的 AC5 支持的最低 MDK 版本还不完全一样。AC5 早期版本比如 5.03 可能跟 MDK 5.37 的 license 机制有兼容问题。实测 5.06 update 7 是最稳妥的选择支持新老工程兼容性也最好。安装过程中如果杀毒软件报拦截尽量加白名单。AC5 安装包里包含一些命令行工具部分杀软对armcc.exe这类老的编译工具比较敏感误杀之后会导致 MDK 检测不到编译器。3.3 安装后如何确认已经生效装完之后在 MDK 菜单栏打开“Project - Manage - Project Items”切到“Folders/Extensions”标签页下面有个“ARM Compiler”区域你会看到版本列表里多了一个能选的编译器显示类似ARM Compiler 5.06 update 7 (build 960)到了这一步就已经成功了一大半。剩下要做的就是让工程认到这个编译器。4. 在工程里切换、配置编译器并彻底消除报错这一步做完再编译就会发现之前的 not available 没了。但切换编译器还需要注意一些配置层面的衔接问题。4.1 修改工程选项里的编译器版本打开你的工程点魔术棒Options for Target切到 Target 标签页找到 ARM Compiler 下拉框。如果你希望统一用 AC5直接选择Use default compiler version 5或者直接选具体的 ARM Compiler 5.06 update 7点 OK保存重新编译。4.2 检查 include path 和宏定义是否漂移编译器版本换过来之后最常见的二次报错是缺头文件。这不是编译器没装好而是工程的 include path 配置问题。AC5 和 AC6 的默认头文件搜索路径不同AC5 更依赖你手工配置。在编译器报缺core_cmSimd.h这类文件时多半是 CMSIS 路径没配对。你把工程自带的 CMSIS 文件夹路径手动加到 C/C 选项卡的 Include Paths 里就行。宏定义这块也要留意AC5 默认会定义__CC_ARM__ARMCC_VERSION__CORTEX_M3看你的芯片如果你代码里有#if defined(__CC_ARM)的片段切换到 AC6 之后这些分支会失效。所以如果你打算长期留在 AC5 上就别把代码写成#ifdef __GNUC__这种只对 AC6 生效的判断。4.3 使用多个编译器版本时的坑MDK 支持在一个 IDE 里同时装 AC5 和 AC6然后在不同工程、不同 target 之间切换。但要注意同一个工程文件里如果路径下缓存了编译中间产物切换编译器之后可能出现“fake”错误。我自己的习惯是切换完编译器后先执行一次“Project - Clean Targets”再重新 Build。否则你看到的报错可能是旧编译器生成的.o文件和.d依赖文件混在一起导致的。4.4 查看具体的编译命令链如果你想确认 MDK 到底有没有走 AC5直接看编译输出窗口。AC5 编译的时候输出行首会出现类似armcc.exe --c99 --split_sections ...而 AC6 则会是armclang.exe -stdc99 ...这两种命令开头很好辨认。看到 armcc 出现说明编译器切换成功not available 的报错就不会再出现。5. 常见问题与排查技巧这部分是我从自己踩坑经历和帮同事处理报错过程中整理出来的按出现频率排个序。5.1 装完 AC5 还是提示 not available明明安装了 AC5但 MDK 还是不认。先做三件事彻底关闭 MDK重新打开工程。确认你的 AC5 安装在 MDK 的 ARM 目录下路径不要乱改。打开“Project - Manage - Project Items - Folders/Extensions”看看左侧列表里有没有编译器选项。如果还是没有大概率是 MDK 的注册信息缓存问题重启电脑往往能解决。5.2 MDK 提示 License 不包含 ARM Compiler 5这个问题较隐蔽。MDK 的授权分两种一种是带 AC5 的 MDK Professional一种是只有 AC6 的 MDK Essential。如果你用的是免费的 MDK 社区版它的组件列表可能不包含 AC5 授权。遇到 License 问题时下载安装 AC5 并不能解决你得在“File - License Management”里看自己当前的授权类型。国产品牌芯片用户经常用免费版容易踩这个坑。解决办法是让用户切换到支持 AC5 的授权或者干脆购买正式授权。另外老版本的 AC5 安装包对 license file 的读取方式跟新版本有差异如果你用的授权文件是很早之前生成的重新生成一次新的 license 也能解决很多莫名问题。5.3 编译过程报语法错误这是 AC5 和 AC6 切换后最常见的连锁反应但如果你本来就是 AC5 工程装完 AC5 编译依旧报语法错误就不要赖编译器了。多半是你工程里引用的一些源码自带的预编译条件有问题。举个例子有些芯片厂商的库文件里会有#if defined ( __CC_ARM ) #pragma anon_unions #endif如果这个宏没被正确传递编译器可能忽略掉#pragma导致union匿名成员报错。解决方法是在 C/C 的 Misc Controls 里手动加--diag_suppress111或者检查宏定义列表。5.4 如何让新工程默认使用 AC5如果你公司内部统一用 AC5希望新建工程时默认值就是 AC5不手动去改可以在 MDK 的模板工程里先设置好。把ARMCC的路径埋进模板的 include path省的每次创建工程都要手动配置 MDK 会自动带入编译器的默认路径但工程相关的一些老旧用户头文件路径还是得靠模板。5.5 一个老工程师的快速排查流程我这几年遇到类似报错习惯按这个顺序排查基本不超过 5 分钟打开工程文件.uvprojx用文本编辑器搜索关键字ArmCompiler看到类似ArmCompilerDefault compiler version 5/ArmCompiler确认工程要的就是 AC5。打开“Project - Manage - Project Items - Folders/Extensions”看有没有 AC5 的注册项。有就切编译器然后编译没有就进 Pack Installer 补装。补装之后重新启动 MDK再切编译器。如果还有问题看 License Management。这套流程几乎能覆盖 90% 以上的场景。5.6 从工程层面统一解决方案如果你手头维护的项目特别多不想每个工程都手动切一次编译器可以直接在.uvprojx里全局替换。用 Notepad 或者 VS Code 打开工程文件搜索“Default compiler version 5”整段批量替换成目标编译器的名称。但注意工具链配置里的路径和编译选项还是要逐个确认不然替换完反而会引入新的问题。这种操作适合批量处理组内遗留的老工程但建议先备份原文件再小规模试编译。6. 最后的个人体会我在实际折腾这个报错的过程中最大的体会是Keil MDK 在编译器管理这块其实已经做得很清晰了报错信息直接告诉你缺什么还告诉你是哪个 target比很多 IDE 的“编译失败”要友好得多。很多人卡住不是因为问题本身难而是没有把“编译器”当成一个独立的软件组件来理解。如果你遇到的是 ARM Compiler 5 缺失真正重要的是三个动作去 Pack Installer 里下载安装 ARM_Compiler_5在工程选项里选择对应编译器经历过一次完整编译确认 path 和宏没丢。做完这三步这个报错基本不会再找麻烦。以后再拿到一个老工程可以先打开 .uvprojx 看一眼编译器版本。如果是 AC5但你自己又装了 AC6不要直接点编译先动手把编译器确认好能省下大把排查时间。
返回列表