最近又有人在群里贴编译报错截图Keil MDK 的 Build Output 窗口里一行红字Error: C9555E: License checkout of a feature has failed后面跟着 ARM_Compiler_Core 之类的一串英文。评论区照例炸锅一多半人让他重装系统、重装 MDK、删注册表。我在嵌入式这一行摸爬滚打了十几年处理过上百次这类报错负责任地说真正的授权过期只占其中一小部分大部分许可证错误的根源是系统时间错乱、编译器版本路径没配好、或者证书压根没装到该装的地方。重装解决不了问题反而会把环境搞得一团糟。这篇文章把 Arm Compiler 许可证错误的来龙去脉讲透从授权模型到报错信息再给一套完整的修复流程最后把那些教程里不写的边角坑一并交代。无论你用的是 MDK 5.36 还是 5.41无论报的是 C9555E 还是找不到 armcc照着顺序排查基本都能解决。1. 许可证错误的本质MDK授权和Arm Compiler授权是两套体系1.1 主授权管IDEFeature管编译器Keil MDK 的授权体系分两层。第一层是 μVision IDE 本身的主授权也就是你在 File License Management 窗口里看到的那个 license 条目它决定你用的是 MDK-ARM Professional专业版还是 MDK-Lite免费评估版同时也控制调试器、RTX 中间件、部分库组件的开关。第二层是 Arm Compiler 编译器工具链的授权。Arm Compiler 虽然是跟着 MDK 安装包一起分发的但它有自己的授权开关以 feature特性位的形式记录在同一份 license 文件里。编译的时候armcc 或 armclang 会去调用 FlexLM 授权服务检查对应的 feature 是否存在且有效。如果检查失败编译器直接罢工抛出一串以 C 开头、以 E 结尾的错误码这就是你看到的 C9555E、C9935E。打个比方主授权是小区门禁卡管你能不能进楼编译器 feature 是房间钥匙管你能不能开门。门禁卡正常但钥匙不对你照样进不了房间——很多人只盯着门禁卡看自然查不出问题。1.2 AC5 和 AC6 的授权位各不相同Arm Compiler 分成两个大版本授权检查的 feature 名也不同Arm Compiler 5armcc老牌编译器经典稳定很多老工程的灵魂。Arm Compiler 6armclang基于 LLVM/Clang 架构从 MDK 5.15 开始引入MDK 5.36 之后成为新工程默认编译器。这两个编译器在授权层面是独立 feature有的报错信息会明确写 ARM_Compiler_Core_5 或 ARM_Compiler_Core_6。如果你的工程切到了 AC6但当前登录的授权里只有 AC5 的 feature一样会报许可证错误。这类问题在从老工程迁移到新 MDK的场景里极其常见我后面专门讲。1.3 多数许可证错误其实是背锅侠还有一个很容易被忽略的事实很多人遇到的根本不是授权问题而是编译器路径丢失、组件没装全、或者工程文件里记录的编译器路径指向了已卸载的旧目录。μVision 找不到 armcc 可执行文件时给出的提示常常带着not availablenot licensed这类字样用户一看license就以为是授权坏了其实完全是自己吓自己。所以解决这类问题的第一步不是重装而是先定位到底错在哪一层。下面这张对照表可以帮你快速缩小范围。报错线索失效环节常见触发场景C9555E / C9935E编译器 feature 签出系统时间错乱、授权不含对应编译器特性、授权服务被拦截License Expired / No LicenseMDK 主授权试用到期、证书未激活、绑定信息变更找不到 armcc / armclang编译器安装或路径老工程配了 AC5 但新 MDK 没装 AC5、目录被改L6220E / code size exceeds链接器代码尺寸限制免费版代码超 32KB被误当成许可证问题2. 先看清报错形态再动手常见错误信息逐一拆解2.1 C9555E 和 C9935E编译器特性签出失败这是 Arm Compiler 最常见的授权报错完整信息一般是类似这样的Error: C9555E: License checkout of a feature has failed. Feature: ARM_Compiler_Core_5 Flex License: NOT_FOUND这里的关键是最后一行的 Flex License 状态。NOT_FOUND 表示授权服务根本没有找到能匹配的 feature可能是系统时间超前或滞后、license 文件损坏、电脑硬件信息变更比如换了网卡、重装了系统导致主机标识变化导致证书失效。针对这种报错我的排查顺序固定是这样先看系统时间尤其是时区。虚拟机里时间飞了的情况我见过太多。打开 License Management看授权列表是不是空的、有没有过期。如果授权在但报错依旧把授权删掉重新加载一次触发重新签出。检查杀毒软件是否拦截了 Keil 的授权服务进程。2.2 License Expired 是另一回事如果 License Management 窗口里直接写着 License Expired那是主授权试用期到期了。MDK 的试用授权有明确有效期老版本常见的是 30 天现在申请页面会写明具体期限。试用期一过MDK 并不会立刻完全锁死而是自动降级成 MDK-Lite 模式IDE 还能用但代码尺寸限制在 32KB 以内。这里有个很多人不知道的细节试用期到期后即使你重新申请了新的试用授权如果电脑上还残留旧的过期授权记录新授权可能无法正确生效。我遇到过好几次清理 License Management 里所有过期条目、重启 μVision 再重新加载新授权就好了。2.3 免费版超尺寸限制的报错长得很像许可证问题MDK-Lite 免费版在 Cortex-M 内核上有 32KB 的机器码体积限制。代码一旦超过这个值编译到链接阶段就会报错比如 L6220E 开头的 Execution region 超限但很多人截图发群里时描述成许可证错误编译不了。严格说这不是授权 file 缺失而是授权等级不够高。你要么精简代码控制体积要么升级成完整授权。对初学者来说如果只是学习 STM32 的基础外设32KB 一般够用不用急着花钱。3. 标准修复流程五步定位并解决许可证故障下面这套流程是我处理这类问题的标准动作按顺序走不要跳步。跳步是很多人在这一步反复折腾的根源。3.1 第一步打开 License Management 确认证书现状在 μVision 菜单栏点 File License Management弹窗里能看到当前所有授权记录。你需要关注这几个信息Product 列显示 MDK-ARM Professional 还是 MDK-Lite。Expires 列授权有效期。如果显示 expired说明主授权完了。下方特性区域能看到 ARM、C 等关键 feature 是否被勾选。如果整个列表是空的说明电脑上压根没装过 license那就不是修的问题而是装的问题。你需要准备一个有效的 PSN 或 .lic 文件在弹窗里点 Add LIC 添加。我看到太多人的操作是License Management 都不开直接卸载重装。其实重装对 license 记录无效因为授权信息不一定在 MDK 安装目录里而是分散在系统级的授权目录中。先看一眼这个弹窗能省掉一整天的折腾。3.2 第二步校准系统时间与时区这步看起来简单但中招率极高。Arm Compiler 的授权签出会对比本机时间和授权有效期时间差一旦超过容忍范围直接拒绝。典型触发场景主板的纽扣电池没电开机时间回到 2015 年。Windows 关闭了自动设置时间时间停在上次关机时。虚拟机快照回滚时间跳回几天前。跨时区出差Windows 时区没同步更新。打开 设置 时间和语言 日期和时间确保自动设置时间打开然后点立即同步。同步完再重新编译一次。这步成本一分钟却是我处理过的报错里大概 30% 的答案。3.3 第三步重新加载授权文件触发重新签出如果时间和授权都看着正常但报错还在那就把授权重新插拔一次。在 License Management 窗口里先选中现有授权记录点 Remove LIC 删掉然后手里有 .lic 文件的话直接点 Add LIC 选择文件手里有 PSN 注册码的话粘贴进去点 Add LIC授权文件正常但状态诡异可以点 Update LIC 触发在线同步。这一步的本质是让 μVision 重新向授权服务发起签出请求清掉失效的签出状态。很多时候授权服务和编译器进程之间握手失败重插一下就好。3.4 第四步以管理员身份运行并清理授权服务进程如果第三步无效考虑权限问题。Windows 下 μVision 和授权服务通信时如果权限不足授权服务可能无法正常启动或加载 key。做法右键点击 μVision 快捷方式选择以管理员身份运行。打开任务管理器找到 lsv3.exe 或名称里带 lsv 的进程这是 Keil 的 FlexLM 授权代理结束它。关掉 μVision再次以管理员身份打开重新编译。这个杀代理进程的技巧在授权服务卡死时特别管用比重启电脑快得多。另外如果装了第三方杀毒或防火墙把 Keil 安装目录和进程加入信任区很多时候授权服务首次联网或写临时文件被拦就会出现 C9555E。3.5 第五步检查 TOOLS.INI 和编译器路径走到这里如果还报错那大概率不是授权本身的问题而是路径问题。Keil 安装目录下有个 TOOLS.INI 文件默认 C:\Keil_v5\TOOLS.INI记录了各种组件路径。如果系统重装、软件迁移、或装过多个版本这个文件里残留的路径可能指向不存在的位置。打开 μVision 的 Project Manage Project Items切到 Folders/Extensions 页能看到当前使用的 ARM Compiler 路径。确认这些路径真实存在。顺手在工程设置里检查一下 Options for Target Target 标签页看 ARM Compiler 下拉框选的是哪个版本。4. 老工程的编译器丢失问题AC5.06 的安装与配置4.1 为什么工程突然说找不到 armcc还被人当成许可证错误如果你打开一个老工程Build 输出里出现类似Target uses ARM-Compiler Default Compiler version 5 which is not available这类提示先别急着怀疑授权。MDK 从 5.37 开始默认安装包不再附带 AC5 编译器新工程直接使用 AC6。但老工程在建工程时记录的是 Arm Compiler 5新环境里没有 AC5于是 IDE 不知道去哪找 armcc给出的提示里带着 not available看起来特别像授权问题。Arm Compiler 5 系列的最终版本是 5.06 update 7也就是大家常说的 build 960。这个版本在国内单片机论坛里被反复讨论不是因为新恰恰是因为它老得稳定、老工程兼容性最好。大量 STM32 老工程和教程都是基于 AC5 写的用 AC6 打开可能报一堆语法警告甚至错误。4.2 正规途径装回 AC5.06 update 7装回 AC5 不需要重装 MDK。正规做法有两种方式一通过 Pack Installer 安装 ARM_Compiler 软件包。在 μVision 里点 Pack Installer搜索 ARM_Compiler找到 Keil::ARM_Compiler 这个包点 Install。这个包里就带了 Arm Compiler 5 的完整工具链装完 MDK 会自动识别。地址栏搜到了不要装错成别的包。方式二到 Arm 官网的 Legacy Compiler 下载页找到 ARM Compiler 5.06 for Keil MDK 的安装包手动安装到 Keil 目录下。安装时注意选择与 MDK 相同的根目录否则路径对不上等于白装。顺便说一句市面上流传的AC5 网盘下载包很多是旧版甚至被改动过的我用过一次就吃了亏。能走官方渠道就走官方渠道实在网络不便至少核对一下安装包的数字签名是否有效。4.3 在工程设置里固定编译器版本装完 AC5 之后打开工程进入 Options for Target Target 标签页在 ARM Compiler 下拉框里明确选择ARM Compiler 5.06 update 7 (build 960)适用于纯老工程ARM Compiler 6.x适用于新工程或已迁移项目。新手最容易犯的错是装了多个编译器版本却把工程留在Use default compiler version 5这种自动档上。自动档在某些 MDK 版本里解析逻辑有变化就会偶发找不到编译器。手动固定版本你会少掉 80% 的莫名奇妙报错。另外如果工程是 AC5/AC6 混用的复杂项目比如部分库文件用 AC5 编主程序用 AC6建议先把所有源文件统一成同一个编译器排除变量后再谈兼容。混合编译不是不能做但绝对不适合入门阶段。4.4 Windows 11 下安装时的组件勾选MDK 5.36 之后的安装包在 Windows 10/11 上安装时流程中有一个组件选择界面。很多人全程狂点下一步结果把编译器组件漏掉了。装的时候留意确认 Core 组件被勾选这是 AC6 运行本体。看到 ARM Compiler 5 或 Legacy Support 这类选项如果以后可能要打开老工程直接勾上。如果装完才发现没勾不需要重装用前面的 Pack Installer 补装 Keil::ARM_Compiler 包即可。Win11 上如果安装器表现异常右键安装包选择属性把兼容模式改成 Windows 8再用管理员身份运行基本能过。5. 那些教程里不会写的边角坑5.1 多版本 MDK 共存的路径灾难很多人的电脑上同时装着 MDK 5.29、5.34、5.36甚至还有 C 盘、D 盘各一份。这类环境出许可证问题的概率远高于干净环境。原因是 TOOLS.INI 和授权服务的状态可能互相覆盖老版本的授权记录被新版本读到新版本的组件路径被老版本覆盖最后哪个版本都不好用。我的建议很简单如果不需要多版本联调只保留一个最常用的版本装到默认目录。如果你吃不准哪个版本适合自己直接选你手头芯片例程包要求的最低版本向上兼容通常比向下容易得多。5.2 杀毒软件把授权服务干掉的情况有一次帮一个网友远程排查C9555E 报了两天License Management 里授权显示正常系统时间也正常。折腾到最后发现他电脑上的安全软件把 Keil 目录下的授权相关文件隔离了。文件夹里少了个文件授权服务启动时静默失败编译自然报错。处理方式在杀毒软件的信任区里把 C:\Keil_v5 整个目录加进去同时把 μVision 的可执行文件和授权服务进程加白名单。加完恢复被隔离的文件再重启一次 μVision问题当场消失。5.3 中文路径和项目存放位置这不算许可证错误但经常和许可证问题一起出现所以提一嘴。工程路径、MDK 安装路径如果包含中文或特殊字符比如带空格的目录、带点的文件夹编译器在解析路径时可能出错报的错看起来也像是环境坏了。LLVM 架构的 armclang 对路径里的非 ASCII 字符尤其敏感。标准做法MDK 装到 C:\Keil_v5工程放在纯英文路径下例如 D:\Projects\stm32_demo。这个习惯能帮你避开一大片莫名其妙的编译问题。5.4 关于破解工具的真相为什么不建议碰这个必须单独说。网上有大量一键破解注册机资源很多人在许可证报错后第一反应是去找这些工具。但根据我处理过的案例这类工具带来的问题比解决的更多改过的 DLL 和注册机经常被杀毒软件报毒来源不明的文件在开发机上执行风险极高。破解授权和正版授权的 feature 不匹配常常出现装上后能打开 IDE但编译器反而报更奇怪的授权错误。一旦电脑硬件变动或 MDK 升级补丁破解状态随时崩而且没有任何可用的技术支持。对个人学习和非商用项目完全可以用 MDK-Lite 免费版32KB 限制对基础学习足够。对商业项目买一份正版授权是对自己时间负责也是法律红线。如果你实在不想在这个工具链上花钱还可以用免费的 STM32CubeIDE 或 GCC ARM Embedded 工具链没必要为了省授权去冒险。最后说几句实在话这些年处理下来我的体会是Keil MDK 的许可证错误 90% 都是环境问题而不是授权本身的问题。系统时间、TOOLS.INI 路径、编译器组件缺失、授权服务被拦截这四个点占了绝大多数。下次再看到 C9555E不要第一反应卸载重装先按这篇文章的顺序看时间、看授权管理、重插授权、清授权进程、查路径大概率十分钟内能解决。最后分享一个小习惯每新建一个工程我都会把 Options for Target 里的编译器版本手动固定下来并把 TOOLS.INI 备份一份放到工程目录旁边。这个习惯让我在换电脑、重装系统后十分钟内就能恢复完整的编译环境省下大量查错时间。