我让实习生装了最新 MDK,结果群炸了 前言最近在单位带了一批实习生新人统一安装 Keil MDK 环境时我自信满满地让他们去公司的应用助手下载最新版MDK 5.38。结果当晚微信群炸了——编译例程报错红得刺眼。Rebuild started: Project: FPS100 *** Targetxxxxxuses ARM-CompilerDefault Compiler Version 5whichis not available. *** Please review the installed ARM Compiler Versions:Manage Project Items - Folders/Extensionsto manage ARM Compiler Versions.Options for Target - Targettoselectan ARM Compiler Versionforthe target. *** Rebuild aborted. Build Time Elapsed: 00:00:00我远程一看好家伙MDK 5.38。这坑我熟但熟的是坑不是路。问题根源ARM 的断舍离Keil MDK 从5.37 版本开始安装包不再预装ARM Compiler Version 5以下简称 AC5默认只携带Compiler Version 6AC6。验证方法打开任意工程 → 右键Options for Target→Target选项卡正常情况5.36 及以前你的情况5.37ARM Compiler:V5.06 update 7(build 960)ARM Compiler:V6.xUse default compiler version 5仅有 version 6 选项为什么这很重要国内 90% 的 STM32 入门教程、开发板配套例程、竞赛代码模板基于的都是ST 标准外设库StdPeriph_Lib或更早的寄存器写法。这些代码写于 2010–2015 年与 Compiler V6 存在大量不兼容内联汇编语法差异__asmvsasm编译优化行为变化头文件宏定义解析差异部分隐式类型转换被 AC6 判定为错误注意MDK 5.37可以使用 AC5只是安装包不再自带。你需要手动安装见下文。我踩过的弯路强行把旧工程改为 Compiler V6在 Options for Target 里把编译器从 V5 改成 V6然后满怀期待地点 Rebuild。结果../FreeRTOS/port/RVDS/ARM_CM4F\portmacro.h(184): error: unknown type name __forceinline static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) ^ ../FreeRTOS/port/RVDS/ARM_CM4F\portmacro.h(179): note: expanded from macro portFORCE_INLINE #define portFORCE_INLINE __forceinline ^ ../public/klog/include/klog/klog.h(64): error: linux/string.h file not found #include linux/string.h ^~~~~~~~~~~~~~~~ FPS100\FPS100.axf - 342 Error(s), 45 Warning(s). Target not created.原因分析AC5 使用armcc经典编译器AC6 使用armclang基于 LLVM/Clang。__forceinline是 armcc 特有的关键字armclang 不认识。linux/string.h是 GCC/Linux 风格的头文件引用armclang 同样不认。想解决这些错误→ 需要逐个修改 FreeRTOS 移植层、改内联汇编语法、修头文件路径……对老工程来说工作量等价于一次完整的工具链迁移。改 V6 绕的路比装 V5 长十倍。正解手动安装 Legacy Arm Compiler 5MDK 5.36 有 AC5MDK 5.37 没有——自己装一个。ARM 官方提供了旧版编译器的独立下载安装后注册到 µVision 即可使用。推荐版本Arm Compiler 5.06 update 7 (build 960)这是 AC5 的最终版本2020 年 9 月发布。步骤一准备工作项目要求ARM 账户免费注册https://developer.arm.com解压工具7-Zip.tgz嵌套存档需要两次解压Windows 自带的不够用磁盘空间约 500 MBKeil 安装路径确认你的 MDK 装在哪个目录如C:\Keil_v5步骤二下载编译器访问官方下载页Legacy Arm Compiler 5, 4.1, and RVCT (ACOMP5)登录 ARM 账户在Revision下拉框中选择r5p6-07rel1点击下载“Arm Compiler 5.06 update 7 (build 960) Win32”PS:如果说注册存在困难实在是没办法下载那也可以试试这个【免费】ARMCompiler-506-Windows-x86-b960.7z资源-CSDN下载文件名ARMCompiler_506_Windows_x86_b960.zip约 280 MB偶尔会遇到点击 Agree 按钮后出现 “System Error” 的情况——换一个浏览器或清除 cookie 后重试即可。步骤三解压与安装下载的.zip里套了一个.tgz需要两次解压序号操作工具得到1解压.zip任意解压工具ARMCompiler_506_Windows_x86_b960.tgz2解压.tgz7-ZipARMCompiler_506_Windows_x86_b960.tar3解压.tar7-ZipInstaller文件夹进入Installer文件夹以管理员身份运行setup.exe。安装路径关键安装程序默认会装到C:\Program Files (x86)但这是不能用的——独立编译器必须装在 Keil 主目录下才能找到授权配置文件TOOLS.ini否则编译时会报A9555E许可错误。在安装向导中修改安装路径为C:\Keil_v5\ARM\ARM_Compiler_5.06u7如果已经装到了默认路径直接剪切整个ARM_Compiler_5.06u7文件夹到上面的位置即可。然后在 µVision 的 Folders/Extensions 中删掉旧路径、重新添加新路径。安装完成后验证C:\Keil_v5\ARM\ARM_Compiler_5.06u7\bin\armcc.exe存在。步骤四在 µVision 中注册编译器安装完不等于能用——必须让 µVision 知道这个编译器的存在。打开 µVision IDE菜单栏Project → Manage → Project Items…或点击工具栏上的多彩方块图标切换到Folders/Extensions选项卡在 “Use ARM Compiler” 行最右侧点击…浏览按钮在弹出的 “ARM Compiler Versions” 对话框中点击“Add another ARM Compiler Version to List…”浏览到刚才安装的文件夹C:\Keil_v5\ARM\ARM_Compiler_5.06u7选父文件夹包含bin子目录的那一层不要选bin本身。点击 OK。对话框应显示字段值Path.\ARM_Compiler_5.06u7\Version5.06 update 7 (build 960)点击Close。可选点击“Setup Default ARM Compiler Version”将新增的 AC5 设为默认版本后续新工程默认就用它。步骤五切换项目编译器打开你的项目点击魔法棒图标或Project → Options for Target ‘Target 1’切换到Target选项卡在ARM Compiler下拉框中选择“ARM Compiler 5.06 update 7 (build 960)”不要选 “Use default compiler version” 或任何带 V6 的选项。点击OK编译验证点击Rebuild或按 F7Build target Target 1 *** Using Compiler V5.06 update 7 (build 960), folder: C:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin compiling main.c... compiling stm32f4xx_gpio.c... ... linking... Program Size: Code1024 RO-data336 RW-data0 ZI-data1632 ..\OBJ\Project.axf - 0 Error(s), 0 Warning(s).0 Error(s), 0 Warning(s).熟悉的绿色回来了。常见问题与排错Q1安装后还是报 “compiler not available”你已经装了 AC5但 µVision 不认识它。排查路径确认已执行Project → Manage → Project Items → Folders/Extensions → 添加编译器这步确认浏览时选的是父文件夹而非bin子目录确认父文件夹下确实有bin\armcc.exeQ2编译报 A9555E 许可错误最常见原因安装路径放在了C:\Program Files (x86)下。独立下载的编译器不能放在Program Files下——编译器启动时要读取 Keil 主目录下的TOOLS.ini放别处找不到直接报 A9555E。解决方法把整个ARM_Compiler_5.06u7文件夹剪切到C:\Keil_v5\ARM\下然后在 Folders/Extensions 中删除旧路径、重新添加新路径。如果路径没问题但仍然报 A9555E继续排查下面几点。Q3编译报许可错误 / “User Based Licensing technology”原因一UBL 不能直接授权 AC5自 MDK 5.37 起由于 AC5 已停产Keil 新型的用户绑定许可证UBL无法直接授权 AC5。需要让管理员登录公司的 Arm 授权账户后台专门为你的电脑生成一个向后兼容的Node-Locked绑定电脑许可证导入到 Keil 的 License Management 中才能使用。参考 ARM 官方知识库KA006456。原因二环境变量ARMLMD_LICENSE_FILE丢失添加独立编译器后有时会覆盖或丢失原有的证书链。排查步骤打开 Windows 系统环境变量检查变量ARMLMD_LICENSE_FILE或LM_LICENSE_FILE是否存在如果公司使用浮动许可FlexNet 许可证服务器确保变量值正确指向服务器格式为端口号服务器IP例如8224192.168.1.100原因三FlexNet 服务器版本过老AC5.06u5 及以上版本强制要求公司的许可证服务器FlexNet Publisher版本在11.14.1.0 或以上。如果服务器 FlexNet 版本过老新编译器会拒绝握手并报 A9555E。验证方法请 IT 或许可证管理员在服务器上运行lmutil lmstat -c查看守护进程Daemon版本。若版本过低需前往 Arm 官方后台下载新版服务器组件升级。Q4Windows Defender 导致编译极慢MDK 的发行说明明确记载了此问题。解决方案将 Keil 安装目录C:\Keil_v5添加到 Windows Defender 的排除列表中。设置路径Windows 安全中心 → 病毒和威胁防护 → 管理设置 → 排除项。Q5AC5 编译 HAL 库工程能行吗部分较新的 HAL 库代码使用了 AC6 才支持的语法如__ALIGNED新版写法。如果编译 STM32CubeMX 生成的新工程建议直接用 AC6。AC5 主要适用于基于标准外设库的旧工程。长远建议什么时候该放弃 AC5场景建议学校课程 / 竞赛 / 老项目维护用 AC5别折腾新立项、产品级开发迁移到 HAL/LL 库 Compiler V6学习 STM32 新手直接学STM32CubeMX HAL跳过标准库ARM Cortex-M33 / M55 等新内核必须用 AC6AC5 不支持需要 C11/C99 新特性用 AC6AC5 仅有 C90 标准支持Compiler V5 是遗产不是未来。但遗产不代表垃圾——数以百万计的工程依赖它这就是现实。总结ARM 从 MDK 5.37 起把 AC5 从安装包里砍了但没砍对它的支持。装回去就行。问题 → 原因 → 解法 MDK 5.37 编译老工程报错 ↓ 安装包不含 ARM Compiler 5 ↓ ① 从 ARM 官网下载 AC5 独立安装包 ② 解压 .zip → .tgz → .tar用 7-Zip ③ 安装到 C:\Keil_v5\ARM\ARM_Compiler_5.06u7 ④ µVision → Folders/Extensions → 添加编译器 ⑤ Options for Target → 选择 AC5 → Rebuild ↓ 0 Error, 0 Warning关键提醒 准备好7-Zip——.tgz嵌套存档需要两次解压。 装完 ≠ 能用必须在Folders/Extensions里注册。 许可问题去 KA006456。