Keil MDK中ARM Compiler V5缺失的解决办法:下载安装AC5.06完整教程
很多用Keil MDK开发STM32的老手估计都在某个下午被这个报错狠狠教育过明明工程昨天还好好的换台电脑或者重装一次Keil编译按钮一按直接弹出一句“Target uses ARM-Compiler Compiler Version 5 ... not installed”。然后你打开Manage Project Items一看编译器版本那栏赫然写着V5.06但你的Keil里只装了AC6。项目死活编译不过只能干瞪眼。这个问题的根源其实很简单从Keil MDK 5.37版本开始ARM官方默认不再随安装包附带ARM Compiler V5也就是AC5只预装AC6。可大量老工程、教材例程、标准外设库代码当初都是在AC5环境下写的工程文件里锁死了编译器版本。两下一对不上Keil就直接罢工。我踩过这个坑也帮不少人远程处理过今天就手把手把从官网下载AC5.06、安装配置、再到切换编译器的完整流程捋一遍。不管你用的是5.37还是最新的5.40照着做基本都能解决。1. 为什么新装的Keil MDK里会找不到ARM编译器V5先说结论再动手不然很多人装完还是一头雾水。AC5和AC6虽然都叫ARM编译器但它们是两代完全不同的东西AC5基于老的armcc核心编译速度快、对旧代码兼容性好AC6基于Clang/LLVM架构代码优化更强、对C99/C11和ARMv8-M等新架构支持更完善。Keil在5.37版本之前安装包会同时把AC5和AC6一起装进去这也是很多老教程直接说“装完就能用”的原因。但从5.37开始官方调整了策略默认只装AC6。原因也不难理解AC5已经停止功能更新很多年了ARM官方想让开发者逐步迁移到AC6上于是新版本里把AC5降级成了可选组件不再默认包含。问题恰恰出在这——很多旧工程的标准库版本、启动文件、底层寄存器定义都是按AC5的编译规则写的。你用AC6去硬编不是这里报个warning就是那里出一堆error甚至有些语法在AC6里直接就是错的。对做产品维护和考研做毕设的人来说与其满世界改代码不如直接把AC5装回去来得省心。这个compatibility问题短期无解所以掌握AC5的手动安装和配置是每个嵌入式开发者绕不开的基本功。1.1 先判断你的Keil版本和当前编译器状态动手之前先搞清楚自己用的Keil MDK到底是什么版本以及当前装了哪些编译器。打开Keil点击菜单栏的 Help - About uVision弹窗里能看到完整版本号比如 UVision V5.38.0.0。这个版本号很重要直接决定了你该下载哪个编译器包。如果你用的版本低于5.37理论上AC5应该还在除非装的时候手动取消了组件。然后点击工具栏上的魔术棒图标Options for Target切到 Target 页面在右下角能看到一个 ARM Compiler 下拉框。如果里面只有 “Use default compiler version 6” 或者 “V6.18” 之类的选项而没有 V5.06说明AC5确实没装。还有一种判断方法直接去Keil的安装目录下找。默认路径一般是 C:\Keil_v5\ARM\ARMCC如果这个文件夹不存在或者里面是空的那AC5百分之百没装。AC6的安装位置是 C:\Keil_v5\ARM\ARMCLANG两个目录是分开的。1.2 AC5和AC6的代码兼容性差异速查很多初学者会问直接用AC6编译不行吗非要折腾AC5干嘛我用一个表格把两者的核心差异列出来你就明白了对比项AC5 (armcc)AC6 (armclang)底层核心经典ARM编译器LLVM Clang架构C标准支持C90为主C99支持不完整完整支持C99/C11汇编语法支持ARM/Thumb混合汇编主要支持GNU风格汇编关键字兼容支持 __irq、__asm 等旧关键字需要改用attribute或新关键字默认字节序小端小端优化策略偏向代码体积偏向性能和现代指令集旧工程兼容性极好几乎无缝差大量警告和错误差异最大的点在于汇编和关键字。很多老工程的启动文件startup_stm32f10x_hd.s是用ARM汇编写的AC6虽然能编但经常报“unknown instruction”之类的错。还有中断函数写法AC5里用 __irq 关键字AC6里要改成attribute((interrupt(IRQ)))。这些改动动辄几十处工程大的时候改到怀疑人生。所以结论很明确如果你的工程是老的、别人的、教材上的老老实实装AC5别跟编译器较劲。2. 从ARM官网下载ARM Compiler 5.06的完整流程确定需要AC5之后下一步就是把它搞到手。这里有一个关键点AC5不再随Keil安装包分发需要单独从官网下载一个名为 “MDK-ARM Compilers” 的独立安装包。打开浏览器进入ARM Keil官网的编译器下载页面。路径是https://www.keil.com/dd2/pack/ 这个页面是Keil所有软件组件、设备支持包、编译器扩展包的集中下载入口。往下翻或者直接搜索 “MDK-ARM Compilers”就能看到对应条目。需要说明的是ARM官网的页面布局偶尔会变但核心下载入口一直是这个Pack页面。如果你进官网后找不到就直接在网站的搜索框里输入 “ARM Compiler 5” 或 “MDK-ARM Compilers”一般能直接跳转过去。点进详细页面后你会看到一个版本列表里面会有5.06 update 7等版本号。我这里推荐下载 V5.06 update 7也就是常说的AC5.06u7这个版本是AC5系列的最终维护版本之一稳定性最好兼容性覆盖了STM32F1/F4/H7等几乎所有主流芯片。2.1 下载前需要准备的信息和常见问题ARM官网下载不像百度网盘那样给个链接就能直接拉它需要先填一个简单的信息登记表单。别嫌麻烦这是官方分流和用户统计的正常流程。填写的表单内容包括姓名、公司邮箱、所在地区、使用目的等。其中邮箱建议填真实有效的因为下载链接会发送到这个邮箱里。我用QQ邮箱、163邮箱都测试过能正常收到不用担心邮箱类型限制。提交表单后系统会往邮箱发一封包含下载链接的邮件。这个链接一般24小时内有效点开后就能拿到安装了。这里有个小提醒如果等了5分钟还没收到邮件先去垃圾箱翻一翻有时候邮件过滤器会把这种系统邮件直接归到垃圾箱。如果你实在不想填表单还有一个备用渠道通过Keil MDK软件自带的 Pack Installer 来安装。打开Keil点击工具栏的 Pack Installer 图标切换到 Packs 页面在右上角搜索 “ARM Compiler”如果官方发布了匹配你当前MDK版本的编译器包可以直接在这里一键安装。不过实测下来这个通道不一定每时每刻都有AC5的资源还是官网下载靠谱。2.2 下载到的文件长什么样下载完成后你得到的是一个可执行的安装文件文件名格式一般是 MDK-ARM_Compilers_5.06u7b.exe 或者类似的命名大小在190MB到280MB之间。这个体积看起来不小但比完整MDK安装包动辄1GB以上要轻量多了。拿到安装文件后先别急着双击我的建议是把它放一个专门的目录比如 D:\software\KeilAddons\方便后续重装系统或者换电脑时快速找到不用再去官网重新走一遍表单流程。还有个细节值得说这个编译器安装包是通用的不区分32位和64位系统也不绑定特定MDK版本只要你的MDK是5.37以上版本这个包都能用。3. 安装AC5.06时的关键路径配置这一步别偷懒到了安装环节问题就来了——很多人下载完一路Next装完回到Keil里发现还是找不到AC5。为什么因为安装路径错了。3.1 安装路径必须指向Keil的ARM目录否则白装AC5的安装程序本身不会自动检测你电脑里的Keil装在哪里。默认情况下它会尝试安装到 C:\Keil_v5\ARM\ARMCC但如果你当初装Keil的时候改过路径比如装到 D:\Keil_v5 或者 E:\MDK那安装程序就找不到目录只会在默认路径下新建一个空的ARMCC文件夹或者装到一个完全不相干的地方。结果是AC5确实装上了但Keil根本不知道它在哪依然报“not installed”。所以安装到选择安装路径那一步时务必手动指定到你的Keil安装目录下的 ARM 文件夹。举例来说如果Keil装在 C:\Keil_v5那目标路径就是 C:\Keil_v5\ARM如果Keil装在 D:\Keil_v5那目标路径就是 D:\Keil_v5\ARM安装程序会自动在 ARM 目录下新建一个 ARMCC 子文件夹然后把编译器的所有文件放进去。完成后你会看到类似这样的结构D:\Keil_v5\ARM\ARMCC\bin D:\Keil_v5\ARM\ARMCC\include D:\Keil_v5\ARM\ARMCC\lib只有看到 bin 文件夹里存在 armcc.exe 这个文件才算真正装好了。3.2 安装过程中的其他选项设置安装过程中还有一个界面会问是否添加环境变量和桌面快捷方式。这里我的建议是环境变量可以不勾选。Keil调用编译器是自己查内部路径不依赖系统PATH加了反而可能和你机器上其他版本的编译器起冲突。桌面快捷方式看个人习惯无所谓装了也不碍事。许可证相关不用设置AC5编译器不是独立收费软件它的授权跟随MDK主程序走你装了AC5不会另外弹窗要license。安装过程大概持续一两分钟黑窗口一闪而过是正常现象别以为卡死了。3.3 安装完成后验证一下是否成功装完之后不要急着马上开Keil去编译先手动验证一下文件是否齐整。用文件资源管理器打开安装目标路径下的 ARMCC\bin 目录确认以下几个关键文件存在armcc.exeAC5的C编译器主程序armasm.exe汇编器armlink.exe链接器fromelf.exe格式转换工具这四个文件是AC5能正常编译的基石任何一个缺失Keil都会报错。如果发现bin目录是空的或者只有零零散散几个文件大概率是安装路径又指错了回头对一下3.1的操作。验证没问题后重新打开Keil MDK。这里有个小细节如果Keil在你安装AC5的过程中处于打开状态务必先彻底关闭包括右下角托盘里的进程再重新打开。Keil在启动时才扫描编译器目录运行中不会动态刷新。4. 在Keil工程中切换ARM编译器版本及路径设置细节编译器装好了接下来就是让Keil用上它。很多人在安装环节折腾半天最后卡在设置上。4.1 切换工程的编译器到AC5的具体操作打开你的工程或者新建一个工程按快捷键 AltF7 打开 Options for Target 对话框切到 Target 页面。找到右侧的 ARM Compiler 下拉框点击展开正常情况下这里现在会多出一个选项 V5.06 update 7 (build 960) 或者类似的文字。选中它然后点击 OK 保存。这里需要特别提醒一点下拉框里可能同时存在 “Use default compiler version 6” 和具体的 V6.x 版本以及我们刚装的 V5.06。一定要选到那个明确带版本号的 V5.06而不是笼统的 default。default指向的仍然是AC6选了等于没选。选好之后先做一次 Clean点击工具栏的魔术棒旁边那个刷子图标或者按快捷键 F7 旁边的按钮再重新 Build确认错误信息是否消失。4.2 工程级设置、全局默认设置的区分与建议工程级设置只影响当前工程切换后对电脑上其他工程没有影响。这种方式适合只维护一两个老工程的场景。如果你手头积压了大量AC5时代的工程每次新建都要手动切换很烦可以改全局默认配置。操作方法是在Options for Target对话框里设置好编译器后点击右下角的 Set as Default for Target 按钮把当前选择设为全局默认值。这样设置之后以后新建的工程会默认使用AC5作为目标编译器省去重复切换的麻烦。不过这里也有个坑如果你之后想新建一个用AC6的新工程记得要把默认值改回去不然新工程会无声无息地继续用AC5编译。4.3 新建工程的路径和芯片支持包检查还有一个容易被忽略的点装了AC5但新建工程时找不到自己芯片的工程模板比如新建STM32F103C8工程时设备列表里空空如也。这不怪AC5是你还没有安装对应的Device Family Pack。AC5只是编译器负责把C代码变成机器码芯片支持包DFP负责提供芯片型号定义、寄存器头文件、启动文件、Flash算法等。两个是配套关系缺一不可。打开Pack Installer搜索你用的芯片型号比如STM32F1系列就搜 “STM32F1”然后点击 Install 按钮安装对应的DFP包。装好后再回来看设备列表芯片型号就会出现在里面了。注意STM32系列的DFP从某个版本后要求MDK版本至少5.30以上所以如果你的Keil太老可能装不上新的DFP需要先升级MDK主程序。4.4 路径设置中隐藏的两处静态库目录配置这个是很多人忽略的细节。AC5编译器的安装路径在Keil内部有一个映射关系但某些情况下Keil的注册表缓存里可能还残留着旧路径或者错误路径。如果你配置完编译器后编译时出现类似 “AC5 installation not found in registry” 或者 “cannot open include file core_cm3.h” 的报错大概率是路径映射出了问题。解决办法是手动修改Keil的工具链配置在 Options for Target - C/C 页面检查 Include Paths 里是否包含芯片头文件路径一般是 RTE\Device\xxx 或者 Liblary 目录。如果缺失点击后面的三个点按钮把对应文件夹手动加进来。另外在 C/C 页面的 Define 输入框里要确保有 USE_STDPERIPH_DRIVER 和 STM32F10X_HD具体取决于你芯片的容量等级这两个宏定义。缺少任何一个标准外设库代码都编不过。这种问题经常被误判为AC5没装好实际是路径配置的小事。5. 常见问题与排查技巧实录这部分我压箱底的经验全拿出来分享都是一个个跑断腿踩出来的坑。对照着自己排查能省出大半天的时间。5.1 安装完AC5后Keil还是提示找不到编译器这是问得最多的一个问题。原因只有三个路径装错了、Keil没重启、装的是被安全软件拦截的残废版本。针对路径装错的情况按3.1里说的检查 ARMCC 是否存在且包含几个关键EXE文件。针对Keil没重启的情况把Keil完全退出再重新打开。针对最后一种情况装的时候把360、电脑管家之类的杀毒软件先退掉AC5的armcc.exe是命令行小工具容易被误判为风险程序而拦截写入装完看着像成功了实际内核文件被删了一半。提示如果你发现ARMCC目录存在且文件都在但Keil始终不识别可以试试把安装包解压后手动覆盖到目录。用解压工具可以看到安装包的主要产物核心目录结构和 Keil_v5\ARM 是一致的覆盖一遍等效于安装。这个方法算是土办法但实测有效。5.2 切换到AC5后出现大量语法错误AC5安装成功按钮也切换了但一编译排山倒海的error扑面而来。先别慌看错误类型。如果报的都是 “unknown type name uint8_t” 或者 “expected ;”基本是头文件路径和宏定义没配好按4.4的方法补上即可。如果报的是 “#error Please select first the target STM32F10x device used in your application” “请在Define里加入 STM32F10X_HD” 之类的宏定义。如果报的是汇编相关的 “Error: A1514E: Unknown symbol”那可能是你的启动文件和AC5汇编器版本不匹配。解决办法是换用官方标准库自带的新版启动文件不要用网上抄来的老文件。还有一种极其隐蔽的情况你的工程原来是用AC6编译的AC6对某些类型转换的检查比AC5严格切回AC5后反而通过了。反之亦然。这种错误只能逐个改代码没有捷径。5.3 编译链接时报DLL加载失败或系统找不到指定文件这类报错信息形如 “error: L6002U: Could not open file xxx.o”或者 “The ARM C/C Compiler (armcc.exe) has stopped working”。第一种情况是中间文件损坏做一次 Clean Rebuild 即可。第二种情况多半是工程项目路径里包含了中文、空格或特殊符号。Keil对路径兼容性做得不算好尤其是AC5时代的编译器对长路径和中文目录的处理相当脆弱。我的建议是在 C:\Keil_Projects 或者 D:\Embedded_Projects 这种纯英文路径下新建工程别把工程放在桌面上。桌面路径本身没问题但如果你Windows用户名是中文的桌面路径会附带中文这个很难绕开。5.4 AC5和AC6能不能共存以及切换编译器对代码的影响很多工程折腾到最后会想把两个编译器都留着。明确答复能共存而且互不干扰。AC5装在 ARM\ARMCCAC6装在 ARM\ARMCLANG两个目录各自独立Keil根据你在Options里的选择调用对应编译器。但要注意的是共存不等于自由切换。同一个工程用AC5能编过、用AC6大概率报错用AC6是给新代码写的、切到AC5也可能出现语法过时问题。所以实践中的建议是以工程为单位定编译器不要以心情为单位来回切。如果你的工程比较大里面用了CMSIS特定版本注意检查协处理器状态。AC5对CMSIS 5.0以下的老库兼容性最好而AC6最好配合CMSIS 5.5以上版本使用。混搭模式下出现的莫名奇妙的错误九成和CMSIS版本不匹配有关。5.5 用表格理清高频报错、原因和解决路径报错现象根本原因解决路径ARM-Compiler Compiler Version 5 not installedAC5未安装或路径错误官网下载AC5.06安装到Keil\ARM目录Target uses ARM-Compilerplease select工程锁定AC5但Keil无AC5安装AC5 在Options中手动切换cannot open file core_cm3.h头文件路径缺失检查Include Paths补齐芯片头文件目录undefined symbol STM32F10X_HDDefine宏未配置在Define中加入对应芯片宏A1514E: Unknown symbol启动文件与编译器配不上换用标准库官方启动文件L6002U: Could not open file xxx.o中间文件损坏Clean Rebuild清理临时文件AC5 installation not found in registry注册表路径信息缺失重装AC5并确保路径指向Keil\ARM目录armcc.exe stopped working工程路径有中文或空格工程迁移到纯英文目录这张表我建议截图保存遇到问题先对着找比自己一条条翻报错舒服得多。6. 再分享一个压箱底的经验老工程的整体迁移策略解决完眼前的编译错误之后我建议顺带考虑一下后续的策略问题。这两年ARM对AC5的态度已经非常明确了停止维护、停止更新、逐步移出分发通道。你今天能下载到的AC5.06u7大概率就是这个系列最后一个大版本了以后也不会再出u8、u9。所以如果你的工作流高度依赖AC5尤其是做产品维护的有个长远打算会比较稳妥。我的做法是双轨并行老产品线继续用AC5不动新项目一律用AC6开发哪怕初期改造代码多花几天时间也比未来被动迁移强。针对要从AC5迁移到AC6的老工程有几个改造重点可以提前关注把启动文件从ARM汇编改成GNU风格汇编把 __irq、__forceinline 这些关键字改写成标准C语言属性语法把分散加载文件.sct文件改成AC6支持的链接脚本格式。这些东西在AC5下可以继续用但一旦决定迁移改造工作量是一个等差数列——越早迁越省事拖到工程膨胀起来再动就是指数级的痛苦了。另外还有个实用小技巧老工程迁移AC6时不要一把梭全部文件一起编译先用AC6单独编译每个.c文件看单个文件的错误列表。大多数报错都是重复性的语法问题改通一个代表一类问题都能解决。逐个击破再整体链接成功率比直接整编高很多。我个人在实际操作中的体会是AC5和AC6之间的沟壑并没有想象中那么大真正的障碍往往来自那些用了十年都没动过的老启动文件和晦涩的宏定义。只要花一两个晚上把工程里这些历史包袱清理干净AC6的编译速度和代码体积优化用起来确实比AC5舒服不少。最后再补充一个小细节下载AC5.06的时候如果发现官网链接打不开先检查一下网络环境换一个浏览器或者清一下DNS缓存再试。很多情况下不是官网挂了是你的网络到境外服务器的链路不稳定。希望这篇内容能帮你把AC5.06顺利配置起来项目赶紧编过该调试调试该烧录烧录别再卡在编译器这个前置环节上了。