ARTICLE DETAIL

资讯详情

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

Keil MDK找不到ARM Compiler 5.06?AC5下载安装配置全攻略

Keil MDK找不到ARM Compiler 5.06?AC5下载安装配置全攻略 先问你一个场景你刚装好新版的Keil5或者打开一个很久没碰过的老工程准备顺手改几行代码结果编译时Keil直接甩了一句“Target uses ARM-Compiler ‘V5.06 update 7’ which is not available”又或者你打开工程设置发现Target选项卡里ARM Compiler下拉框只剩一个AC6找不到ARM Compiler 5.06。这个问题在Keil MDK用户里已经不算冷门尤其是从MDK 5.37开始官方默认不再集成AC5导致海量老工程直接“翻车”。这篇东西我梳理得比较细从为什么会出现、怎么下载、怎么安装、怎么配置到各种踩坑排查尽量给你一条能走通的路。不管你是刚入门的小白还是被老工程折磨的嵌入式老手看完应该能少走不少弯路。1. 为什么Keil突然找不到ARM Compiler 5.06很多人第一反应是工程坏了、芯片包没装、甚至Keil破解不彻底。先别急着朝这几个方向折腾这个问题的根源其实非常单纯工具链从Keil MDK 5.37版本开始默认安装包里不再携带ARM Compiler 5也就是我们常说的AC5。你装的是新版本而老工程设定用AC5编译两者对接不上自然就报“找不到编译器”。这不是你的工程有问题而是编译器这个零件压根没装上去。1.1 版本迭代带来的“消失”Keil MDK-ARM的编译器其实有两条主线一条是经典的ARMCC也就是AC5系列最后稳定版本停在5.06 update 7build 960左右另一条是AC6基于LLVM/Clang架构从MDK 5.18开始作为可选组件引入后来逐步成为默认主推。在MDK 5.36及更早版本里AC5是默认自带的你装上Keil就能直接用。但从MDK 5.37开始官方调整了安装策略默认只装AC6AC5变成需要单独下载、单独安装的“遗老组件”。到了MDK 5.38、5.39如果你不主动下载安装AC5打开一个指定AC5的工程就只能看到那个“not available”的报错。很多用惯了老版本的人根本没意识到这一点因为一直用的都是装机自带编译器的旧版本从来没手动装过AC5。等换到新电脑、装了新Keil才发现这玩意儿居然还需要单独“认亲”。1.2 找不到AC5的三种典型症状根据我帮人排查的经历这个问题通常有三种表现形式你可以对号入座一下第一种编译时直接弹出错误框提示“Target uses ARM-Compiler ‘V5.06 update 7’ which is not available”或类似文案。这说明工程文件里写死了用AC5但当前Keil环境里没有。第二种打开Options for Target - Target选项卡发现ARM Compiler下拉框里只有“Use default compiler version 6”或“Use default compiler version 5”选项但选了AC5后编译依旧失败因为实际没有可用的AC5工具链。第三种下拉框里能看到AC5选项但编译日志里显示调用的其实是AC6或者编译后出现一大堆语法报错看起来像是编译器“发疯”了。这种情况多半是编译器路径配置错乱Keil找不到真正的armcc.exe退而求其次使用了AC6。无论哪种表现最后要解决的核心只有一件事让Keil找到AC5安装包并且能用它编译工程。1.3 为什么老工程死活离不开AC5很多人会问AC6不是更新更好吗为什么非要找回AC5原因很简单很多老工程、老芯片支持包、第三方库根本不兼容AC6。举几个典型例子STM32的标准外设库SPL早期版本、一些老版本的DSP库、某些第三方静态库.lib都是基于AC5语法和编译规则构建的。AC6基于Clang对C99和C11标准支持更严格对老代码里那些“不规范但能跑”的写法容忍度很低。比如旧代码里常见的__asm内联汇编、__forceinline、#pragma用法在AC6下可能会报错或者行为不一致。网上的教程、开源项目、学校实验代码更是大量停留在AC5时代。你要是把编译工具链硬切到AC6一个稍大的老工程编译出几百行错误都很正常。所以大家宁可麻烦一点把AC5装回来也不愿意去改造那些历史代码。2. 动手之前先备齐两样东西版本确认与AC5安装包在动手配置之前有两件事必须先搞清楚你的Keil MDK是哪个版本以及你手里有没有AC5安装包。这两样不备齐后面的配置步骤很容易白忙活。2.1 确认MDK版本决定走哪条配置路径打开Keil uVision点菜单栏Help - About uVision可以看到当前版本号。这一步真的很重要因为不同版本的配置方式不一样MDK 5.36及更早版本一般自帯AC5如果找不到大概率是安装时被清理了或者被其他软件改动过TOOLS.INI文件这种情况直接看第3.1节。MDK 5.37及更新版本默认不带AC5需要手动下载安装然后在图形界面里配置路径走第3.2节。MDK 5.20左右的老版本界面里没有多编译器管理入口只能通过TOOLS.INI手动改同样看第3.1节。顺便说一句如果你把Keil装到了C盘默认的C:\Keil_v5目录查找文件会方便很多。如果你装到了D盘或其他位置后面配置路径的时候记得改成你自己的实际目录这个细节很多人会忽略。2.2 下载ARM Compiler 5.06 Update 7安装包AC5的最后一个稳定版本是5.06 update 7也就是build 960。网上能搜到很多第三方分享的下载链接但为了文件完整和安全还是建议从官方渠道获取。打开Arm官网arm.com搜索“Arm Compiler 5.06”进入产品下载页面。这里通常要求注册一个Arm账号并登录输入一些基本资料后就能下载。也可以在Keil官网的Downloads页面里找“Legacy Tools”或“MDK Legacy Support”之类的入口有概率直接提供AC5的下载包。下载时会看到Windows、Linux、macOS等不同平台的安装包Windows用户一般选择x86/x64版本即可。下载下来的文件可能是zip压缩包也可能是exe安装程序。如果是zip先解压到临时目录里面会有setup程序或免安装的编译器文件。注意看压缩包内部结构如果是直接解压就能用的ARMCC目录那你其实可以跳过安装步骤直接把它放到Keil的ARM目录下。如果是exe安装包需要双击执行安装。2.3 安装细节目录、权限、文件核对AC5的安装路径有讲究。建议安装到Keil MDK安装目录下的ARM子目录里。我把两种常见布局列一下老式布局C:\Keil_v5\ARM\ARMCCARMCC目录下面有bin、include、lib等子目录。新式布局C:\Keil_v5\ARM\ARM_Compiler\5.06u7目录内部的bin目录里有armcc.exe。安装时尽量以管理员身份运行安装程序否则可能因为写入权限不足导致文件不完整。安装完成后务必去bin目录里看一眼确认armcc.exe、armlink.exe、fromelf.exe几个关键可执行文件都在。这一步不到一分钟能提前排除很多后续问题。另外一个特别容易踩的坑安装路径不要带空格也不要放到C:\Program Files (x86)这种目录下。Keil本身对路径里的空格就敏感AC5也是。路径一旦带空格Keil经常能扫描到编译器但无法正常调用或者干脆识别不出来。老老实实放C:\Keil_v5\ARM\ARMCC能省掉很多麻烦。3. 从安装到配置AC5全流程实操现在到了最核心的部分——怎么让Keil认识AC5。我按老版本和新版本分开说因为它们的配置入口确实不一样。如果你不确定该用哪一套先返回第2.1节看版本号再往下走。3.1 老版本MDK5.36及以前的TOOLS.INI配置法老版本Keil没有图形化的“添加编译器”入口它主要靠TOOLS.INI这个配置文件来识别工具链。这个文件在Keil的安装根目录下比如C:\Keil_v5\TOOLS.INI。用记事本打开TOOLS.INI你会看到类似这样的结构[UV2] ORGANIZATIONYour Company NAMEUser, [C51] PATHC:\Keil_C51\ VERSION9.60 PRODUCTPK51 [ARM] PATHC:\Keil_v5\ARM\ VERSION5.36 PRODUCTMDK-ARM Plus重点看[ARM]段下的PATH它指向MDK的ARM目录而不是ARMCC目录。Keil会在这个路径下继续寻找ARMCC、ARM_Compiler等子目录。如果你安装AC5后Keil依然找不到编译器可以先检查[ARM]段的路径是否正确。错误的情况通常有两种一是路径指向了C51的目录导致Keil在ARM目录里啥也没找到二是路径指向了不存在的目录。手动修改TOOLS.INI其实很简单把PATH改成实际安装目录保存关闭再重新打开Keil。如果AC5装在C:\Keil_v5\ARM\ARMCC那PATH一般保持C:\Keil_v5\ARM\即可。如果AC5装在别处比如D:\Tools\ARM_Compiler\5.06u7那建议在TOOLS.INI里把这条路径加进[ARM]段或者干脆把AC5复制到Keil的ARM目录下让结构标准化。需要注意改TOOLS.INI前最好先复制一份备份。文件里还可能有[UV2]、[C51]这些段改动时别碰其他段的内容。保存后重启Keil一般就能识别了。3.2 新版本MDK5.37及以后的图形化配置法MDK 5.37以后的版本提供了更友好的图形化管理界面操作路径是Project - Manage - Project Items切换到Folders/Extensions选项卡。在这个页面里你能看到一个ARM Compiler相关的下拉框。点开下拉框如果里面只有Use default compiler version 6那就说明当前环境还没把AC5添加进去。此时点击旁边的Add another ARM Compiler...按钮。弹出来的对话框会让你选择编译器所在目录。这里的关键是选到的目录必须直接包含bin文件夹也就是armcc.exe的上一级目录。比如AC5装在C:\Keil_v5\ARM\ARMCC那你要选的就是C:\Keil_v5\ARM\ARMCC这个目录本身确认后Keil会自动扫描里面的编译器版本。添加成功后下拉框里会多出一项类似V5.06 Update 7 (build 960)。选中它然后点击OK保存。如果设置了Set as Default以后新建工程默认也会用AC5这个看你个人喜好。如果你因为网络原因无法下载AC5安装包还有另一个省事的方法从装了旧版Keil的同事或旧电脑上把整个ARMCC目录拷过来放到新Keil的ARM目录下然后按上面的图形化步骤添加这个目录。这招实测有效因为AC5本身并不依赖注册表属于绿色工具链。3.3 在工程里切换编译器并完成全量编译编译器添加完成后接下来要在具体工程里切换。操作路径很简单右键工程名 - Options for Target - Target选项卡找到ARM Compiler下拉框。如果你在第3.2节已经添加了AC5这里下拉框应该能看到类似V5.06 Update 7 (build 960)的选项选它就行。如果没有说明Keil还没识别到回到上一步检查路径。切换完编译器后强烈建议执行一次Project - Clean Target然后再Rebuild。原因很简单之前如果用AC6编译过工程目录里会残留AC6的中间文件包括一些.o、.d、.crf文件。这些文件是AC6的产物混进AC5的编译流程很可能导致奇怪的链接错误甚至让你误以为AC5有问题。Clean掉重新编译才能保证整个工程是在AC5下重新生成的。编译通过后可以顺便看一下Build Output窗口正常会显示类似compiling stm32f10x_gpio.c...以及linking...最终出现0 Error(s), 0 Warning(s)这说明AC5已经跑起来了。如果还有报错别急第4节说了常见问题的排查办法。3.4 配置完仍然报错的排查顺序如果你严格按照步骤配置完Keil还是找不到AC5或者编译依旧失败我建议按下面的顺序排查排查项操作要点工程是否保存并重启配置完编译器后先保存工程再完全关闭Keil重新打开。是否选对了目标芯片在Device选项卡里确认已经选中具体芯片型号不要停留在默认值。芯片包是否安装在Pack Installer里搜索对应芯片安装Device Family Pack。是否在正确的目录添加编译器图形界面添加时目录必须包含bin子目录选错层级会识别失败。是否有管理员权限尝试右键“以管理员身份运行”Keil再进工程设置确认。工程是不是拷自其他电脑老工程从别人电脑拷过来需要重新清理中间文件再Rebuild。正常来说走到这一步问题基本都能解决。如果还不行那大概率不是AC5的问题而是工程本身或芯片包的问题继续看第4节。4. 实操中必踩的坑问题排查与细节经验AC5配置这一步走通之后并不代表万事大吉。根据我自己的经历和帮别人处理问题的过程后面还可能冒出一堆“连带问题”有些看起来和AC5有关其实完全不是一回事。这一节把几个高频坑集中说一下建议收藏。4.1 头文件打不开、CMSIS版本冲突配置完AC5编译时突然报cannot open source input file stm32f10x.h或者core_cm3.h这种问题经常被误以为是AC5没装好。其实头文件找不到跟编译器本身不是一个层面的问题。先检查芯片支持包DFP是否安装。在Pack Installer里搜索你的芯片型号比如STM32F103C8T6对应的是Keil::STM32F1xx_DFP装最新版或和工程匹配的版本。注意有些很老的工程用的是很早期的芯片包而新版芯片包可能对库函数文件做了调整导致stm32f10x.h路径对不上。另外一个隐藏比较深的问题老工程配了很新版本的CMSIS包而CMSIS 5.x和AC5在某些细节上会有兼容性问题尤其是启动文件startup_xxx.s和core_cm3.h的版本配合。如果排除了其他原因还报头文件错误可以考虑把CMSIS包版本降级或者换用芯片包自带的旧版CMSIS。具体操作是在Pack Installer的Versions下拉栏里选择历史版本。4.2 AC5与AC6混用引发的语法兼容问题有些工程文件比较多可能有人图省事给个别文件单独指定了AC6编译选项或者整个工程切到了AC6却希望AC5能“兼容”那些代码。实际情况是AC5编译AC6优化的代码或者反过来都会产生大量警告甚至错误。尤其是内联汇编的写法差异最大。AC5里常见的__asm { ... }写法在AC6里可能直接被忽略或报错AC6更倾向于用__attribute__((naked))配合GNU风格内联汇编。如果你在装好AC5后编译工程发现错误集中在某些带汇编的文件里大概率是文件被设置为AC6编译或者工程本身混用了两种编译器。我的建议很简单一个工程里最好不要混用AC5和AC6。老工程全用AC5新工程全用AC6中间不要搞“一工程两制”。如果某个工程确实需要AC6编译特定文件建议先把整个工程切到AC6能编译通过再单独调整个别文件而不是在AC5的大前提下混编译。4.3 Keil C51和MDK共存时的配置丢失问题这个问题很容易被忽视尤其是电脑上同时装了Keil C51和Keil MDK的人。C51是8051单片机用的工具链MDK是ARM芯片用的工具链两者共用同一个uVision外壳而它们的工具链信息都写在同一个TOOLS.INI文件里。常见的坑是这样的你先装了MDK配置好AC5一切正常后来为了做51单片机又装了Keil C51。C51的安装程序有可能会重写或修改TOOLS.INI把MDK的[ARM]段弄丢或者改坏。再打开MDK工程AC5又不见了。解决方法不复杂打开TOOLS.INI确认文件里同时存在[C51]和[ARM]两个段且两个段的PATH都正确指向各自的安装目录。如果发现[ARM]段没了手动补上即可。为了避免这个坑我自己是把C51和MDK分别装到两个不同目录比如C:\Keil_C51和C:\Keil_v5两个目录各自有独立的TOOLS.INI互不干扰。实际使用时用哪个就打开哪个虽然麻烦一丁点但真的省心很多。4.4 Target选项卡里XTAL变灰、烧录失败的连带问题如果你切换AC5后顺利编译通过但又遇到两个看起来八竿子打不着的问题这里顺便说一下排查思路。一个是Target选项卡里XTAL晶振频率输入框变灰怎么点都改不了。这个和AC5没有关系通常是因为你在Device选项卡里没有选择具体芯片型号或者选到了一些“Generic”设备。去Device页面重新选好芯片比如STM32F103C8XTAL输入框就会恢复正常。另一个是烧录失败提示Flash Download failed - Target DLL has been cancelled或类似错误。这里面最典型的原因是Flash编程算法缺失。在Options for Target - Debug - Settings - Flash Download里你要确认算法列表里添加了对应芯片的算法比如STM32F10x系列的Flash算法。如果列表是空的点击Add按钮从Keil安装目录的ARM\Flash下选择正确的算法文件。这个问题的根源多半是芯片包没装好跟AC5关系不大但很多人因为先遇到AC5问题容易把烧录失败也归咎于编译器。4.5 从长远看哪些项目必须AC5哪些可以切AC6说到底要不要找回AC5取决于你手上的工程。根据我的经验下面几类情况建议老老实实用AC5使用标准外设库SPL且没有升级打算的工程比如STM32F1/F2/F4老系列。依赖第三方静态库.lib的工程而且第三方库是基于AC5编译的一换编译器里面的符号可能就链接不上。使用了较多ARMCC特有指令、内联汇编、旧版__packed、__align等关键字的底层代码。你手头有大量参考代码都是AC5时代的并且不想花时间去适配。反过来下面这些情况可以直接用AC6早切早轻松从STM32CubeMX生成的工程官方已经默认适配AC6。新项目、代码量不大语法风格比较规范的。准备使用CMSIS-RTOS2、新版本FreeRTOS、新版本DSP库这类积极跟进新工具链的中间件。如果真的要切AC6迁移成本主要集中在内联汇编、编译器内置函数、浮点ABI设置和优化选项这几个方面。建议先把工程Clean掉切换编译器后逐个文件排查报错能改的改改不了的再用AC5兜底。5. 一些个人经验供你参考AC5这个配置问题我前前后后处理过不少次包括帮同事救火、给论坛网友支招自己也在新旧工程之间来回切换过。给几个我个人的土办法如果你手头还有旧版MDK的安装包比如5.36或更早的版本找一个有网的条件装一次装完别急着卸载直接把ARM\ARMCC目录整体备份出来。这个备份的ARMCC几乎可以复制到任何新版Keil上用比每次都去官网从头下载安装包快得多也稳得多。如果你经常要在AC5和AC6之间切换建议在工程目录下放一个文本说明记录“这个工程用AC5还是AC6芯片包版本是多少CMSIS版本是多少”。尤其是那种放了几个月再回来维护的工程你会发现这些信息比什么都重要。别问我怎么知道的都是我踩过的坑。最后再分享一个小技巧配置好AC5后打开Options for Target - C/C看一眼Language / Code Generation那块的Define是否包含你需要的宏比如STM32F10X_MD这种。老工程经常因为遗漏宏定义编译报各种莫名其妙的错误和编译器版本一点关系都没有。把编译器装好、路径配好只是第一步工程自身的宏定义、头文件包含路径才是决定编译能不能过的关键。祝大家早日摆脱“编译器找不到”的烦恼。
返回列表