
我在Win11上线后一直用虚拟机跑开发环境直到有次需要在实体笔记本上复现一个老项目才面对面见识了“新系统老工具链”的组合能造出多少幺蛾子。装的是KEIL5 MDK最新版打开同事发来的基于STM32F103的工程一点Build满屏的“core_cm3.h not found”和“__inline”语法报错。我当时以为项目文件缺了反复重装了三遍最后才发现问题根本不在这——新版本的MDK默认只带ARMCC V6编译器而我这个项目全程依赖ARMCC V5编译器。这篇文章把我在这台Win11笔记本上安装、激活、调通KEIL5 MDK与ARMCC V5的全过程完整记录下来包括版本选择的思路、Pack管理、License离线激活以及几个特别容易踩的坑。如果你也是因为老工程、老SDK或者公司固件库必须留在ARMCC V5那这篇内容可以直接照着操作。1. 为什么Win11下安装KEIL5 MDK会遇到“编译器消失”的问题1.1 新系统并不是最大的敌人很多人在Win11上装MDK前都会担心系统兼容性。实际上KEIL5 MDK在Win11上运行本身几乎没有不可逾越的障碍我的实测结论是主程序、调试器、Pack Installer都能正常跑。真正的问题集中在两个地方一是新老编译器版本的切换二是系统权限和杀毒软件对安装过程的干扰。我在安装时还特意对比了Win10和Win11的表现结论是Win11对普通桌面软件没有想象中那么“不友好”但它的UAC用户账户控制等级默认较高而且Windows Defender的实时保护会在后台扫描新写入的编译器文件个别版本甚至会把注册机或破解补丁直接隔离。所以如果你是从老电脑迁移过来的用户首要注意的其实是权限和杀毒白名单而不是“Win11能不能装KEIL”。1.2 MDK版本与ARMCC V5的绑定关系这是整篇指南里最关键的一个背景知识。从MDK 5.37版本开始ARM官方把ARMCC V5从默认安装组件中移除新安装的MDK只默认携带AC6ArmClang。也就是说你在我这台Win11上装最新的MDK 5.39甚至5.40从“裸装”状态打开一个老工程会自动选择AC6进行编译。AC6的语法规则更加严格很多为老编译器写的启动文件、内联汇编和底层寄存器操作到了AC6下面会直接报错。这也是我开头说的“满屏红色错误”的真正原因——不是你的代码坏了而是编译器换人了。为了理解这个分界线可以等成这张表MDK主程序版本默认携带编译器使用ARMCC V5的方式MDK 5.36及更早ARMCC V5默认 V6安装后直接可用MDK 5.37ARMCC V6默认需单独安装ARM Compiler 5.06u7MDK 5.38 / 5.39 / 5.40ARMCC V6默认需单独安装ARM Compiler 5.06u7ARMCC V5的最后一个版本是5.06 update 7这个版本号你会在之后的安装和验证中反复看到。它发布于2019年左右之后KEIL团队彻底转向了AC6生态。所以如果你必须留在AC5就不要在“下载V5编译器”这件事上花精力寻找更新的版本5.06u7就是终点。1.3 Win11的系统策略变化是如何影响安装的Win11对从网上下载的安装包默认有SmartScreen过滤如果你是从官网下载的MDK还好说但如果你下载的是转发资源或者百度网盘里的包双击运行时可能会被SmartScreen拦截标题栏会显示“Windows已保护你的电脑”。这种时候不要慌点击“更多信息”再点“仍要运行”就能继续。如果你公司电脑开了更严格的策略可能连这个入口都没有那就只能找IT管理员解除限制。另外Win11 22H2以后的系统默认把“以管理员身份运行”收在右键二级菜单里我建议在安装MDK主程序之前先右键选择“显示更多选项”再找到“以管理员身份运行”这一步可以避免很多权限不足导致的隐性故障。2. 安装前必须搞清楚的版本关系与下载策略2.1 MDK主程序版本怎么选这是安装前最重要的决策。我的建议是不是非最新版不可而是要根据你手里项目的编译需求来定。如果你的老项目用AC5且你希望安装过程最简单可以直接选择MDK 5.36及更早的版本安装完成后AC5就是默认编译器不用额外下载任何组件。但坏处是版本较老对新芯片、新调试器的支持相对少一些。如果你选择MDK 5.37及以上版本那么安装结束后需要单独安装ARM Compiler 5.06u7才能使用AC5。这一套组合是我在Win11上实测最顺的因为主程序更新某些Pack和调试器的兼容性更好。如果你的项目已经全部迁移到AC6那直接装最新版没有障碍。从官网下载MDK安装包需要注册并登录账号。下载时注意安装包的名字比如MDK537.EXE、MDK539.EXE这类命名格式。下载完成后有条件的话可以对照官网的SHA校验值核对一下文件完整性我之前遇到过下载一半网络中断导致安装包损坏的情况双击安装时直接提示“not a valid application”白白浪费了半小时。2.2 ARMCC V5单独包的获取如果你决定走“新版MDK单独AC5”的路线那下一个要下载的就是ARM Compiler 5.06u7这个兼容包。正确的下载路径是KEIL官网的Software Packs目录搜索“ARM_Compiler”找到ARM_Compiler.5.06u7的条目下载ZIP格式的Pack文件。这个包很小几十MB级别但作用非常关键。它本质上不是MDK的插件而是一个编译工具链。安装完成后你的MDK目录下会出现一个名为ARMCC的文件夹里面是完整的armcc.exe以及相关头文件、库文件。注意如果你只安装了它但没有安装MDK主程序它是不工作的两者的顺序一定是先主程序再编译器包。下载这个包同样需要登录。有些读者反馈在浏览器里无法直接下载可能被浏览器安全策略拦截建议右键复制链接后用浏览器自带的下载管理器下载不要用第三方多线程工具。2.3 芯片支持包PACK的选择MDK的芯片支持是通Pack体系来管理的不下载对应的DFPDevice Family Pack即使编译器、主程序都装好了也无法创建工程。常用的Pack表格我整理在下面芯片系列Pack名称备注STM32F1Keil.STM32F1xx_DFP老项目最常见STM32F4Keil.STM32F4xx_DFP高性能系列STM32H7Keil.STM32H7xx_DFP新系列GD32F10xGigaDevice.GD32F10x_DFP国产替代常用NXP LPC系列NXP.LPC..._DFP按具体型号搜索下载Pack的方法我在下一节详细讲下载策略上建议优先从官网pack页面下载其次才考虑在MDK的Pack Installer里在线安装因为在线安装在国内网络环境下经常慢到超时。3. Win11下的安装细节从主程序到PACK每一步该点哪里3.1 安装MDK主程序路径、权限与Defender拿到MDK安装包后先右键选择“以管理员身份运行”。安装路径我强烈建议保持默认的C:\Keil_v5不要改到中文目录也不要改到带空格的路径否则后续某些第三方工具链和脚本解析路径时容易出问题。如果你安装到了D盘也要确保路径中没有中文和特殊符号。安装过程中的选项默认的“Add to PATH”和“Create desktop shortcut”都可以勾选没有副作用。有一个“Installer will launch Pack Installer”的选项我建议你暂时取消勾选等MDK主程序安装完、重新启动电脑后再手动打开Pack Installer这样能避免安装流程在Pack这一步长时间卡死。关于杀毒软件我遇到过一次Windows Defender把ARMCC的某个DLL文件当成风险软件隔离的情况结果编译时总是提示“找不到编译器”。处理办法是在Windows安全中心里把C:\Keil_v5目录添加到“病毒和威胁防护”的“排除项”中。这个操作不会让系统不安全但能避免KEIL目录里的编译工具被反复检查和误杀。3.2 安装ARMCC V5编译器包MDK主程序安装完成后先不要着急新建工程接下来处理ARMCC V5。打开MDK然后打开Pack Installer图标是一个彩色魔方或者通过菜单Project Manage Pack Installer进入。在Pack Installer的界面里点击菜单File Import选中你下载好的ARM_Compiler.5.06u7.zip文件。导入过程很快完成后左侧的Installed列表中会看到ARM Compiler 5.06 update 7这一项。另一个安装方式是直接把ZIP压缩包解压运行里面的Setup.exe。这个方式也可以但需要你手动确认解压目录指向了C:\Keil_v5\ARM否则MDK识别不到编译器路径。我推荐用Pack Installer导入的另一种原因就是不需要手动处理路径问题。装好后你可以到C:\Keil_v5\ARM\ARMCC\bin目录下确认是否有armcc.exe文件如果存在说明V5编译器已经就位。3.3 安装芯片支持包与Pack Installer加速技巧芯片支持包的安装同样在Pack Installer里进行。但这一步在国内网络环境下经常遇到“Online checking”卡住的情况个人实测最稳妥的办法是从官网Pack页面把对应的.pack文件下载下来然后在Pack Installer里通过File Import逐个导入。比如你用的是STM32F103C8T6就下载Keil.STM32F1xx_DFP这个包。导入后在Pack Installer的Devices树形结构中定位到STMicroelectronics STM32F1 Series STM32F103就能看到具体的芯片型号了。如果你用的是GD32等国产芯片则需要去对应厂商官网或KEIL官网搜索厂商自己的Pack。Pack版本不建议盲目追求最新。老工程建议先试工程原本用的Pack版本因为新Pack里的CMSIS版本可能比老工程预期的新进而引发头文件冲突我在第5章会专门讲这个坑。下载时留意pack文件名里的版本号比如Keil.STM32F1xx_DFP.2.4.1.pack老项目用这个版本通常比较稳。3.4 验证三个组件是否全部就位安装完成后我建议你进行一次“三确认”确认MDK主程序能正常启动菜单栏不报缺库或权限错误。确认C:\Keil_v5\ARM\ARMCC\bin目录下存在armcc.exe这个是AC5的核心程序。确认Pack Installer的Installed列表中有对应的芯片Pack且状态为Installed。如果三条都成立环境基本就搭建好了。我个人的习惯是下一步立刻新建一个最简单的空工程什么都不写直接编译一次确认工具链链路是通的再打开真实项目。4. License激活实操CID、LIS与离线激活全流程4.1 激活流程从CID到License打开MDK菜单栏点击File License Management弹出的对话框上半部分会有一个Computer ID这个就是CID。它是基于当前机器的网卡和系统指纹生成的一串标识码KEIL的License和CID严格绑定换了一台电脑CID就会变化原来的License就无法继续使用。如果是正版授权你需要把这个CID提供给你的授权管理员管理员在ARM官网的授权管理页面输入CID并选择对应的License类型系统生成一段License文本或一个LIC文件。然后把这段文本粘贴到License Management下方的License框里点击Add License状态栏出现“Valid”且有效期正确激活就完成了。如果你拿到的是一个LIC文件则点击界面右侧的“Use LIC File”按钮选择文件后系统会自动导入并激活。整个过程不需要网络连接所以离线环境下也能搞定。4.2 Win11重装或升级后License失效的处理这是我在这台Win11笔记本上遇到最头疼的问题。我的原电脑在Win10下已经激活过MDK后来把硬盘拆到新笔记本装Win11结果打开License Management发现License不可用。原因就是新机器的CID和原来那台机器不一样License和CID绑定了。正确的处理方法不要尝试在新机器上修改MAC地址去强行匹配旧CID那是无意义的折腾。正确做法是先备份旧机器的License信息然后拿着新机器的CID去找授权管理员重新生成一份。如果是公司或学校购买的License这个过程通常很快邮件发一下CID几分钟就能拿到新的License。4.3 常见激活报错与排查在我安装和帮朋友排查的过程中遇到过三种典型情况第一种是“License Not Valid”。常见原因是CID输入错误或者License粘贴时多了空格检查一下首尾是否有多余字符。第二种是“License Expired”。这个一般是临时评估版License到期只能联系授权方续期或者使用官方提供的评估版限制功能。第三种是“License is corrupt”。这个多见于从老系统里直接拷贝LIC文件到新系统的情况文件本身没坏但和当前CID不匹配。需要重新生成License而不是反复导入同一个旧文件。这里要提醒一下如果你只是学习用途没有公司或学校的授权也可以使用MDK的评估模式代码容量限制在32KB以内。对于学习STM32基础开发来说大部分示例代码都能在限制内编译够用了。5. 首测编译ARMCC V5环境下最容易翻车的三个坑5.1 翻车现场一工程还挂在AC6上环境都装好后我打开了那个老项目直接点了Build。结果依然报错但这次报错和开头不太一样是类似“option --c99 not supported”的提示。这个报警很明显是AC5编译器不识别AC6风格的参数导致的但问题根源是工程设置里的编译器下拉选项还停留在AC6。处理方式在菜单栏找到Project Options for Target或者直接点击工具栏的“魔术棒”图标。在Target选项卡里找到ARM Compiler下拉框把它从Compiler version 6改成Version 5.06 update 7。如果你导入ARM_Compiler成功下拉框里会自动出现这个选项。改完后点OK再次编译。这里我还遇到一个细节有些盗版或修改版的MDK工程文件里编译器ID被写死成“6”下拉框选了V5但编译日志里还是显示ArmClang。解决办法是关闭工程用文本编辑器打开工程文件后缀为.uvprojx搜索ArmCompiler字段把版本号改成5060750或者你实际安装的V5版本号然后重新打开工程。5.2 翻车现场二Pack版本冲突引发的“头文件找不到”修改完编译器选项后我再次编译这次报错变成了“core_cm3.h not found”。这个问题在STM32F1老工程中非常经典原因不是系统缺少这个文件而是工程当前引用的头文件搜索路径与新安装的CMSIS Pack版本不匹配。新下载的Keil.STM32F1xx_DFP中CMSIS核心头文件被更新到了更新的版本而老工程的代码或启动文件使用的是旧版CMSIS的接口。两者混用时编译器可能在旧的CMSIS目录里找不到core_cm3.h因为新Pack目录结构变了。解决办法有三个层次第一在Project Manage Pack Installer里把芯片Pack版本回到你项目原本使用的老版本。第二如果你不想动全局Pack版本可以手动在C/C选项卡的Include Paths里把老工程原来依赖的CMSIS头文件目录加回去。第三如果是老工程本身包含了完整的CMSIS源码那就确保include路径中排在第一位的是项目自带的CMSIS目录而不是Pack自动添加的目录。这个坑最容易在“全新安装开发环境后打开旧工程”时发生。很多人的第一反应是重装Pack实际上更稳妥的思维是先看工程的Include Paths配置。5.3 翻车现场三armcc.exe路径异常有一种情况是编译器下拉框里选V5也选了Pack也装了但编译时报“Program Not Found”或者“Tool Not Found”。这种基本上就是MDK找不到armcc.exe。先检查C:\Keil_v5\ARM\ARMCC\bin\armcc.exe是否存在。如果不存在说明ARM_Compiler这个包没有真正安装到当前MDK的目录下。可以从Pack Installer右上角的“Configuration”里看到当前使用的Pack目录和MDK目录是不是同一个。如果你在安装ARM_Compiler时选择了解压到自定义目录就会导致MDK找不到它。处理办法删除当前ARM_Compiler注册信息重新通过Pack Installer导入导入路径选择MDK默认的C:\Keil_v5\ARM即可。如果是公司电脑有统一管理也可以把ARMCC整个目录复制到C:\Keil_v5\ARM下但要注意路径层级保持bin目录和armcc.exe的结构不变。5.4 如何确认AC5编译器真正生效经过上面几轮折腾你可能会疑惑“怎么确认现在编译用的确实是AC5而不是AC6”。最简单的方法是在Build Output窗口看编译日志开头的Compiler版本信息。如果你看到类似这样的输出Compiling main.c... ARMCC V5.06 update 7 (build 960)那就说明AC5已经成功接管了编译过程。如果日志里出现的是“clang”字样哪怕代码没有报错也说明走的还是AC6。我建议第一次编译时不要急着优化编译速度可以在Options Target Listing选项卡里勾选“Generate Assembler Listing File”编译后去List文件夹里看一眼汇编文件头部的工具版本标注这个方法最直观。6. 什么情况下你不必执着于ARMCC V5两代编译器的取舍6.1 什么时候必须用AC5如果你手头的项目是几年前的老工程而且工程里使用了大量的内联汇编、旧版启动文件或者第三方闭源库那强烈建议继续使用AC5。典型的场景包括公司里的量产固件维护项目、某些国产芯片厂商的早期SDK、以及部分网上流传的开源老项目。这些项目的代码不一定能在AC6下编译通过强行迁移的成本可能比维护一个老编译器环境高得多。所以安装AC5不是为了“怀旧”而是实实在在的兼容性需求。6.2 从AC5迁移到AC6的几个典型改动点如果你准备开新项目我反而建议直接用AC6因为它的编译错误提示更友好优化能力更强也是ARM未来的主流方向。从AC5代码迁移到AC6时最常见的改动点包括启动文件.s文件部分厂商的旧汇编代码里使用了AC5支持的伪指令在AC6下会提示不支持。建议换成芯片厂商提供的AC6版本启动文件。内联汇编语法老代码里的__asm、__inline等关键字在AC6下需要改成__ASM、__INLINE或者改为标准的GNU风格。类型定义一些老的寄存器定义里可能用了非标准的位域对齐方式AC6会报layout warning甚至错误。不要小看这些改动一个稍微复杂的工程从AC5迁到AC6可能要花一两天来处理编译错误。所以如果你就是做老项目维护的时间宝贵保留AC5反而更高效。6.3 给新人或重装系统后的配置建议如果你现在是在一台Win11新电脑上装环境我建议不要纠结太多直接MDK最新版加ARM_Compiler 5.06u7这个组合。为什么不是最新版单独用因为你永远不知道自己接下来会不会打开一个老工程。AC6和AC5双编译器共存是KEIL MDK最方便的特性之一工程级可以随时切换并不需要卸载重装。花十分钟装上AC5兼容包等于给未来省了一天时间。就我自己的习惯来说新装环境时我会先配置好License再导入芯片Pack然后立刻装ARM_Compiler 5.06u7最后用一个最简单的GPIO工程做编译验证。这一套流程走下来后续打开十年前的工程也能稳如老狗。如果你哪天发现新装的MDK编译老工程突然集体报错先别急着怀疑代码回头看看编译器下拉框是不是被重置回了AC6。