ARTICLE DETAIL

资讯详情

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

Keil MDK新版缺少AC5编译器?手把手安装ARM Compiler 5.06解决编译报错

Keil MDK新版缺少AC5编译器?手把手安装ARM Compiler 5.06解决编译报错 前阵子帮同事接了一个老项目他用的Keil版本是5.38一打开工程点编译就直接弹窗报错Target uses ARM-Compiler Arm Compiler 5.06 which is not available。翻译成大白话就是工程里指定要用ARM Compiler V5可你的开发环境里根本没装这个编译器。这个坑在新版Keil MDK里太常见了尤其是从5.37版本开始官方已经默认不带AC5编译器只给你装AC6。很多老工程、芯片原厂例程、标准外设库工程全都依赖AC5于是编译就卡死在第一步。这篇文章我就把这套完整的解决路径给你梳理清楚从官网下载AC5.06安装包、安装路径怎么选、Keil工程里怎么设置、切回去之后还会遇到哪些坑。我会把每一步的操作细节和截图里该看到什么写明白照着走基本十分钟能解决。1. 为什么新版Keil5安装包不再内置V5编译器1.1 AC5和AC6到底是什么关系很多人一听到“ARM编译器V5”就觉得是Keil版本号其实不是。ARM Compiler 5简称AC5是Keil MDK传统默认使用的C/C编译器底层是ARM自家开发的 armcc/armasm/armlink 系列工具链它从Keil诞生到MDK 5.36一直作为默认编译器随安装包分发。而ARM Compiler 6AC6底层用的是LLVM/Clang架构编译速度快、支持C11/C14等新标准静态检查更严格。从MDK 5.37开始ARM官方把默认编译器切换为AC6安装包里不再自动携带AC5只保留了AC6。也就是说只要你的Keil版本高于5.36安装完大概率只有一个编译器可用老工程一打开就报“not available”。对比项AC5armccAC6armclang编译器内核ARM自家LLVM/Clang默认语法检查宽松严格支持的C标准C90/C99为主C11/C14老工程兼容性好老外设库、汇编能直接过差老代码一堆warning/error编译速度偏慢明显更快Keil 5.36及以下默认自带可选项Keil 5.37及以上需单独安装默认自带1.2 你的工程为什么离不开AC5很多新手不理解“能编译就行为什么非要AC5”我遇到的实际情况主要有三类。第一类是老工程直接迁移比如STM32标准外设库SPL工程、一些早期NXP/新唐的例程。这些工程当年就是基于AC5写的里边的启动文件、内联汇编、编译器优化选项都是按armcc的口味来。切到AC6后经常爆出一堆error比如#pragma用法不兼容、内联汇编格式完全不一样改起来能让人崩溃。第二类是第三方静态库的问题。有时代码是从芯片原厂或方案商那里拿到的对方给你的是.a/.lib库文件这些库本身是用AC5编出来的。AC6环境下链接时可能直接拒绝报A1186E: Incompatible architecture之类。这时候除了换编译器没有别的办法。第三类是老启动文件与分散加载文件的兼容性。部分老工程的.s启动文件和.sct分散加载文件是在ARMCC工具链下设计出来的切换到AC6后即便能通过也会有不少警告。对追求稳妥的工程来说能用AC5就尽量别动。2. 下载AC5.06之前的账号注册与版本确认2.1 你需要注册并存好Arm账号下载AC5.06和下载普通芯片包不一样ARM官网要求必须登录Arm账号才能下载MDK相关的编译器历史版本。没有账号的话点下载按钮会被弹回登录页。注册流程很快打开Arm官网点头像图标选 Register填邮箱、设置密码再到邮箱里点确认链接就行。这里有个小建议注册时尽量用常用邮箱因为这个账号以后下载芯片包、CMSIS包、新版本MDK全都要用建议把密码存到密码管理器里别像我当年一样注册完转头就忘。如果你公司网络环境特殊下载时可能遇到页面响应慢的问题这是正常的Arm官网的下载服务托管在CDN上整体速度不算快耐心等就行。2.2 版本选择建议认准AC5.06 Update 7ARM Compiler 5的最终版本是5.06 Update 7build 960这也是我强烈建议你选择的版本。网上有些教程让你装5.06 Update 3或Update 5实际用下来会踩到老版本存在的一些bug比如特定C模板展开时崩溃、链接优化选项不稳定等。AC5.06 Update 7是ARM发布的AC5系列最终维护版本稳定性有保障。另外提醒一句AC5没有Mac版和Linux版只支持Windows如果你的开发机是其他系统这条路走不通只能考虑虚拟机或换编译策略。下载前顺手确认一下自己Keil的具体版本。打开Keil菜单栏 Help - About uVision能看到完整的版本号。如果你的Keil版本是5.36及以下大概率不需要这篇文章因为AC5应该已经随安装包装好了如果是5.37以上尤其是5.38、5.39这些新版本就按下面的步骤操作。3. 官网下载AC5.06的真实页面走位3.1 找到MDK v5 Downloads页面的Legacy区域先说一个很多教程没点透的关键点在新版Keil的Pack Installer里是找不到AC5安装包的只能在官网下载中心找。具体走位如下浏览器打开 Arm Developer 官网developer.arm.com登录账号。顶部导航 Tools and Software - All Tools在列表里找到 MDK-ARMKeil MDK。进入MDK产品页面后页面下方会有一个MDK v5 Downloads的区域里面有“MDK v5.xx”的最新安装包下载按钮以及一个Legacy标签页。点开 Legacy 标签页往下找Arm Compiler 5.06 for Keil相关条目。这里要特别说明Legacy 标签页里才有AC5.06的独立安装包千万别去下载整个MDK v5.36安装包来覆盖安装。我见过有人为了用AC5直接把整个MDK降级重装了结果工程还是能编但新版芯片包又不支持了非常折腾。如果页面改版后找不到Legacy入口可以缩小范围在Arm官网搜索框直接搜“ARM Compiler 5.06 for Keil”通常第一个结果就是下载页面。3.2 安装包下载后的文件核对AC5.06 Update 7的Windows安装包文件名大致是ARMCompiler_5.06u7_Windows_x86_x64.exe大小在500MB到600MB左右。下载完成后建议先核对一下大小和数字签名右键文件 - 属性 - 数字签名标签页显示签名有效再继续安装避免拿到被篡改的包。如果你是公司内网环境官网下载太慢可以在内网技术群里找同学要一份老包。但哈希校验不能省MD5值对不上就有问题尽量通过官方渠道获取安装包最稳妥。4. 安装路径选错是后续报错的头号原因4.1 安装向导里的默认路径与实际落盘位置拿到ARMCompiler_5.06u7_Windows_x86_x64.exe后双击运行安装向导会有几步选择核心就一个路径指向哪里。很多人一看安装向导顺手选了默认的C:\Program Files\ARM Compiler 5.06结果装完后回Keil里一看工程里还是找不到AC5或者Keil压根识别不到这个编译器。这是因为AC5.06安装包并不会自动把编译器放到Keil的目录里Keil默认也不知道去Program Files目录里找它。正确的做法是安装路径手动指定到你Keil的安装根目录下的 ARM 子目录。举两个最常见的情况Keil默认装在C:\Keil_v5那么AC5.06的安装路径该选C:\Keil_v5\ARMKeil装在D盘比如D:\Keil_v5那就选D:\Keil_v5\ARM安装向导会把文件释放到该目录下的ARMCC文件夹最终形成C:\Keil_v5\ARM\ARMCC\bin\armcc.exe这样的目录结构。这个目录结构是关键中的关键如果你的路径不是以Keil安装根目录的ARM结尾后面配置路径绝对会出问题。4.2 安装完成后如何验证ARMCC已落盘安装过程会花两三分钟完成后先别急着开Keil手动确认一下目录C:\Keil_v5 └── ARM ├── ARMCC │ ├── bin │ │ ├── armcc.exe │ │ ├── armasm.exe │ │ ├── armlink.exe │ │ └── fromelf.exe │ ├── include │ └── lib └── ...如果ARMCC目录不存在说明安装路径选错了卸载重装把路径改到Keil根目录下的ARM。想确认编译器本体能不能运行可以打开命令行窗口WinR输cmd进入C:\Keil_v5\ARM\ARMCC\bin目录执行armcc --version能看到类似ARM Compiler 5.06 update 7 (build 960)的版本信息说明编译器本体没问题。看到报错也不要慌多半是环境变量或路径问题把当前目录切到bin下再执行不要直接在别的目录敲命令。5. Keil工程内切换AC5.06与路径设置实操5.1 魔术棒里的编译器下拉框怎么选AC5.06装好后打开Keil工程先别急着编译。点工具栏的魔术棒图标Options for Target进入Target标签页。这个页面中下部有一个ARM Compiler下拉框点开后会列出当前Keil能识别到的所有编译器版本。正常情况下应该能看到两个选项Use default compiler version 5或者具体的ARM Compiler 5.06/Compiler 5.06 update 7 (build 960)如果之前只有AC6这里只会显示Use default compiler version 6之类。选择AC5.06之后点OK再重新编译一次就能看到控制台输出中出现了armcc的调用信息这就说明Keil已经切换到AC5了。有个细节要注意如果下拉框根本打不开或者打开后只有一个空选项说明Keil没检测到AC5安装包。这种情况下需要强制指定路径见下一小节。5.2 找不到AC5时的手动路径指定方法这是很多人卡住的地方。明明AC5.06装好了目录也对但下拉框里就是没有。原因通常是Keil启动时没有自动扫描到新的编译器或者安装时路径并不是Keil预期的位置。手动指定的路径位置在Project - Manage - Project Items打开后切到Folders/Extensions标签页。这个页面里有一个ARM Compiler区域它显示的是当前编译器路径比如C:\Keil_v5\ARM\ARMCC。如果这里显示的路径和实际路径不一致或者显示的是“Not Found”之类的字样就手动把它改成正确的ARMCC目录。改完路径后建议把整个Keil关掉再重新打开。这个操作非常关键因为Keil对编译器路径的缓存是在启动时加载的热切换经常不生效。5.3 切回AC5后先Clean再编译切换编译器之后第一次编译建议养成 Clean 的习惯。做法是菜单栏Project - Clean Target把之前AC6或旧编译器的中间产物全部清掉然后再Rebuild。不Clean直接编译的话可能会看到一些莫名其妙的现象比如链接时提示对象文件版本不对、符号重复定义这些都是旧的 .o 文件和新的编译器生成的代码在“打架”。Clean之后再编基本能规避80%的怪问题。编译控制台里如果出现compiling main.c... armcc --c99 --split_sections ...那就说明Keil确实在用acccAC5编译。如果命令行里是armclang说明你还在用AC6回头检查一下下拉框选对没有。6. 切回AC5后常见编译报错的排查顺序6.1 报 “which is not available” 的完整排查链路有些同学按照上面步骤操作完重开工程一编译还是报Target uses ARM-Compiler Arm Compiler 5.06 which is not available。这个报错说明工程文件记录的编译器名和Keil实际识别到的编译器对不上。按下面的顺序排查基本一轮能定位第一步确认ARMCC目录真实存在。打开C:\Keil_v5\ARM\ARMCC\bin看看有没有armcc.exe。没有的话回到第4节重装AC5.06。第二步检查Folders/Extensions里的ARM Compiler路径。如果是空白或者显示错误路径改成C:\Keil_v5\ARM\ARMCC以你实际路径为准。第三步确认工程里选中的编译器名称与已安装版本名称一致。魔数棒里如果可选项里只有一个版本但工程指定的是另一个版本字符串也会出现这个报错。把工程里下拉框改成实际安装的版本保存。第四步关闭所有Keil窗口重新打开工程。不要只关工程文件整个IDE退出再启动让它重新扫描一次编译器列表。大部分情况到第四步就解决了。如果还不行看看是否安装了系统防护软件拦截了ARMCC的写权限可以把整个C:\Keil_v5目录加入信任区试试。6.2 编译时找不到 core_cm3.h 或 stm32f10x.h 怎么办切换AC5后另一种高频报错是fatal error: core_cm3.h: No such file or directory这个报错跟编译器版本本身无关而是老工程的CMSIS核心头文件缺失。通常原因是新版的Device Family PackDFP里去掉了旧芯片型号的CMSIS支持文件或者工程使用的CMSIS版本与当前芯片包不匹配。解决办法分两步。先在Pack Installer里确认安装了对应的Device Pack比如STM32F1系列装 Keil::STM32F1xx_DFP。装好之后如果还报这个头文件找不到就看工程里有没有直接引用core_cm3.h可以手动把它加到include路径里。老工程最稳妥的做法是把工程自带的CMSIS目录直接加入C/C编译选项的Include Paths。具体位置在魔术棒 - C/C或AC5下叫C/C标签页 - Include Paths把你工程里CMSIS、Device这些目录全部添加进去。这样就不会过度依赖芯片包里的CMSIS版本了。6.3 AC5和AC6两个版本同时存在时如何避免混乱确认AC5能正常编译后你的电脑上很可能同时存在AC5和AC6两个编译器。这本身不冲突但容易给自己挖坑。我的习惯是一个工程固定一个编译器不来回切。比如老项目一直用AC5新项目用AC6。工程文件里记录的编译器名称和版本是留在工程配置里的你双击一个AC6工程它打开后还是会用AC6编译不受全局设置影响。所以多版本共存本身是安全的。真正容易出问题的地方是C/C编译选项不通用。AC5支持的编译器提示语和一些优化选项在AC6下完全不认识比如--c99是AC5的写法AC6有自己的-stdc99。所以不要在同一个工程里反复切换临时对比编译结果可以但日常开发务必固定。想确认当前编译实际用的是哪个编译器除了看编译控制台输出还可以看生成的 .o 文件或 .map 文件头部的工具链版本信息里面会写着Compiler version。或者直接看编译日志里调用的exe名称armcc就是AC5armclang就是AC6。最后再分享一条实战中的小经验AC5.06的安装包装好后建议把exe安装包单独备份一份到移动硬盘或网盘。ARM官网的下载页面改版频率不低Legacy入口的位置也经常变化等下次换电脑需要重装时再去找官网下载又要折腾一遍账号和页面跳转。手头有安装包加上这篇文章的路径设置步骤装一台新电脑比谁都利索。另外切换到AC5后编译老工程时如果看到一大堆warning可以在C/C编译选项里加上--diag_suppress...按需屏蔽具体屏蔽哪些代码看编译输出里最高频的那几个警告类型不要一刀切全屏蔽否则真正的隐患也会被藏起来。
返回列表