新版Keil MDK添加AC5编译器:ARM Compiler 5安装配置教程
简介面向使用 Keil 进行 ARM 嵌入式开发的工程师这是一份 ARM Compiler 5AC5编译器安装包解决新版 Keil 默认不再自带 AC5、需要手动添加编译器的问题。压缩包共 650 个文件包含 bin 下的编译器、汇编器、链接器等可执行程序include 下的 ARM 头文件与标准库声明lib 下的静态链接库以及大量 C/C 源文件、说明文档整体约 80.3MB。安装包覆盖 ARMv5 至 ARMv8 架构启用后可在 Keil 中生成紧凑高效的代码特别适合需要维护旧工程、兼容传统编译选项或完成分阶段迁移的开发者。目录结构清晰便于按需提取并正确配置 Keil 环境从而快速恢复 AC5 编译流程。目前已有 2254 人学习下载适合希望在不升级项目代码的前提下继续使用 AC5 的嵌入式工程师。 最近好几个朋友几乎同时来找我说的都是同一件事电脑上换了新版Keil之前跑得好好的工程突然编译不过了。打开编译输出一看有的报Registered ARM Compiler ignored, version needs to be 5 or higher有的直接提示找不到armcc。圈内人都知道这是老工程用了AC5ARM Compiler 5而新版Keil MDK从5.37版本开始不再预装这套经典编译器。这篇就把我手动添加AC5的完整流程、版本选择、踩过的坑和验证过好用的配置方案一次说清楚能给正在被同样问题卡住的朋友省下半天时间。先说结论这个问题不是Keil安装坏了也不是工程文件损坏纯粹是编译链缺失。新版Keil MDK默认只带AC6基于Clang/LLVM的armclang而大量从2015年到2021年之间的工程模板、芯片驱动库、DSP库甚至部分RTOS例程都还是按AC5的语法和编译特性写的。两种编译器在C语言标准支持、内联汇编写法、关键字兼容性上有明显差异直接拿AC6去编译老工程往往会出现几百行甚至上千行的报错排查起来非常痛苦。所以手动装回AC5是目前兼容老项目最稳妥的办法。1. 为什么还在用AC5新旧编译器到底差在哪1.1 AC5与AC6的核心差异AC5是ARM官方基于自家编译器技术开发的armccAC6则是ARM收购Linaro团队后基于LLVM/Clang架构打造的armclang。两者底层设计思路完全不同就像是老式手动挡变速箱和现代双离合变速箱——换挡逻辑不同开法自然也不一样。对比项AC5armccAC6armclang底层技术ARM自家编译器LLVM/ClangC语言标准支持C90为主部分C99C99/C11完整支持C支持C03C14/17内联汇编语法__asm/__inlineasm/__attribute__关键字兼容性__irq、__packed等专用关键字丰富更接近GCC风格编译速度单文件编译快优化分析耗时稍长代码密度/性能老平台表现稳定新Cortex-M内核优化更好对旧工程友好度高低语法检查更严格表格里最关键的一行是“对旧工程友好度”。AC6对语法规范要求更严格变量声明位置、隐式类型转换、函数指针调用这些在AC5下只是警告的写法到AC6下直接报错。很多老工程里用了芯片原厂早期提供的底层驱动库这些库代码大量使用AC5特有的关键字和内联汇编AC6根本不认。1.2 哪些工程必须用AC5根据我实际接触过的项目下面这些场景强烈建议直接用AC5使用老版本芯片固件库Standard Peripheral Library的工程比如STM32标准库。使用早期版本RTX5、FreeRTOS移植模板的工程部分旧模板的上下文切换代码用了AC5汇编语法。集成了老版本DSP库比如CMSIS-DSP 4.x的工程库文件按AC5编译过混合编译容易出问题。从同事或GitHub上拉下来的历史项目原开发环境是Keil 5.36或更早版本。涉及大量内联汇编做性能优化的底层代码比如加解密算法、音频编解码、电机FOC控制。在这些场景下硬用AC6去编译不是不能成功但要付出的代码修改量和测试成本往往很高而且改完还可能引入隐藏的性能或行为变化。手动装回AC5反而是成本最低、风险最可控的方案。1.3 Keil版本与AC5的兼容关系Keil MDK 5.36及之前的版本安装包里自带AC5无需额外配置。从MDK 5.37开始官方将AC5从默认安装中移除安装后只有AC6。MDK 5.38和5.39版本里AC5被挪到了独立下载页面但依然可以通过手动方式加回来。当前市面主流版本5.37、5.38、5.39都能完美兼容手动添加的AC5我在5.37和5.38上都验证过编译稳定、下载调试正常。有人可能会问新买的正版Keil也不带AC5吗对从5.37开始即便是正版授权AC5也是作为可选组件单独下载安装的。这不涉及授权问题纯粹是ARM官方希望把生态逐步过渡到AC6但考虑到大量存量工程还是保留了一个手动安装入口。2. AC5安装包从哪下载、选哪个版本2.1 官方下载渠道与版本选择安装包必须从ARM官网获取第三方网盘里的东西我劝你别用。编译器这种东西一旦被人植入恶意代码整个开发环境都不安全而且网上流传的很多版本来源不明装完还可能损坏Keil注册信息。下载地址是ARM Developer官网在搜索框输入ARM Compiler 5.06 for Keil就能找到对应页面。需要说明的是ARM官网近年改版多次现在Toolchain归档分类下能找到历史版本列表。目前最推荐、也最稳定的版本是 ARM Compiler 5.06 update 7版本号5.06u7build 960这是AC5的最终维护版本bug修得最干净对各类芯片厂商驱动库的兼容性也最好。下载时选择Windows平台对应的安装包文件名通常是ARMCompiler_5.06u7_Windows.zip大小在400MB到500MB之间具体数值取决于打包方式。至于5.06 update 6build 750那是u7之前的老版本除非你的工程有特殊兼容性要求否则没必要退回去。2.2 下载时需要准备什么ARM官网下载工具链需要先注册一个免费账号然后登录。下载页面会让你填一份简短的用途调查问卷内容包括所在行业、产品类型、工具用途等随便填一下就能通过几秒钟的事情不用写得特别详细。下载解压后得到一个setup安装程序双击运行就可以安装。这里有个关键细节安装到哪一步无所谓但最终的安装路径最好记下来后面手动配置Keil时要手动指定编译器路径。2.3 安装包到底装到哪个目录AC5安装时有两条路线效果不一样路线一安装到Keil安装目录下。比如Keil装在D:\Keil_v5那么安装AC5时把路径改到D:\Keil_v5\ARM\ARMCC。这样Keil启动时会自动扫描到这个目录识别到AC5编译器几乎不需要手动配置。但这种做法的缺点是一旦Keil重装或升级覆盖目录AC5可能被清掉需要重新装。路线二安装到独立目录比如C:\Program Files\ARM\ARM_Compiler_5.06u7。然后在Keil里手动添加路径。这种做法更规范重装Keil不影响编译器本体我推荐用这种方式。无论选哪条路装完后务必确认bin目录下能看到armcc.exe这个文件这是AC5的核心编译程序后面配置时认准它。3. 手动注册AC5到Keil的完整步骤3.1 在uVision中登记编译器路径这一步是整个流程的核心。打开Keil uVision点击顶部菜单Project - Manage - Project Items在弹出的项目管理窗口中切换到Folders/Extensions选项卡。在这个页面里有一个ARM Compiler下拉框右侧有个...浏览按钮点击它选择AC5安装目录下包含armcc.exe的那一层目录。这里就有个容易踩的坑选择目录时要选到bin目录的上一层也就是包含bin文件夹的目录而不是bin目录本身。比如你装在D:\Keil_v5\ARM\ARMCC那么选择时就要选中D:\Keil_v5\ARM\ARMCC不能选到D:\Keil_v5\ARM\ARMCC\bin。选错的话Keil会提示invalid compiler path这一步卡住的朋友还挺多的。选定后点击OK保存回到主界面。此时重新打开Project - Manage - Project Items - Folders/Extensions应该能看到ARM Compiler下拉框里已经列出了V5.06 update 7的选项。3.2 给工程指定AC5编译链登记好编译器路径后还需要让当前工程切换过去。右键点击工程名选择Options for Target在弹出的对话框中切到Target选项卡。在ARM Compiler下拉框里选择刚添加的V5.06 update 7 (build 960)。这里补充一个细节如果下拉框还是灰的或者只有一个AC6选项说明上一步的路径登记没有生效。重新检查一下目录选择确认目标目录下有bin\armcc.exe然后关掉整个Keil再重新打开这个操作比在菜单里反复刷新更有效实测下来重启Keil能解决90%的识别问题。切换完成后建议做一次Project - Clean Target把之前AC6编译生成的中间文件清掉然后Rebuild。不要直接增量编译混合编译产物容易导致一些奇怪的链接错误。3.3 验证是否配置成功配置完怎么确认AC5真的生效了看编译输出信息就能看出来。AC5编译时控制台第一行会显示armcc -c ...相关的命令并在最终输出中标注compiler version 5.06 update 7。AC6编译时显示的是armclang一眼就能区分。打开编译日志如果能看到类似path\to\armcc --cpu Cortex-M4 ...这样的命令说明AC5已经在工作了。再极端一点可以在代码里加一个AC5特有的编译宏测试比如__CC_ARM在AC5下这个宏是自动定义的AC6下没有。写两行代码验证一下心里就彻底有底了。#ifdef __CC_ARM // 只有AC5编译时才会走到这里 volatile unsigned int compiler_is_ac5 1; #endif4. 常见报错与排查实录4.1 最常见的三个编译报错我在配置过程中实际碰到过、也帮朋友远程排查过的报错集中在这几种报错1Registered ARM Compiler ignored, version needs to be 5 or higher这个警告大概率是编译器版本不匹配造成的。Keil在工程文件里记录了工程创建时用的编译器主版本当你用5.37以上Keil打开老工程时默认会去匹配AC6结果发现工程标的是AC5就报了这个提示然后可能拒绝编译。解决办法就是按前面第3节的步骤手动添加AC5并切换过去。需要注意的是添加完成后建议把整个Keil关掉重开让编译器信息重新加载。报错2Error: L6218E: Undefined symbol链接时找不到符号出现这个报错多半是工程里某些汇编文件、C文件没有成功编译或者使用了AC6的编译选项导致部分代码被跳过。先检查有没有文件被exclude from build了再检查工程里是否混用了AC6的预定义宏。如果工程里引用了老版本库的汇编启动文件比如cortex-m的启动文件建议直接换成对应芯片厂商提供的兼容版本。报错3armcc.exe - fatal error且弹窗提示找不到armcc如果点编译直接弹这个错就是路径登记没生效。去项目管理器里重新设置编译器路径然后重启Keil。还有一种情况是Keil安装在带空格的路径下比如C:\Program Files\Keil_v5虽然一般没问题但某些老版本AC5对空格路径会有兼容性问题建议装到纯英文无空格的目录比如D:\Keil5。4.2 编译路径与中文目录问题这里必须多说一句工程路径、Keil安装路径、编译器安装路径这三处都尽量不要出现中文和特殊符号。AC5是很多年前的产品对非ASCII路径的处理能力很弱中文路径下编译经常出现一些莫名其妙的POSIX路径转换错误或者link阶段找不到中间文件。如果你从别人那里拷贝的工程原本就在中文目录下编译报错类型会非常丰富从文件找不到到头文件解析失败都有。优先把整个工程挪到一个纯英文路径下再编译这是排除问题最快的方式。4.3 AC5和AC6混用的坑有时候一个工程里某些文件手动指定了编译器版本。检查每个源文件的属性在工程文件树上右键单点某个.c文件选择Options for File在Properties选项卡里看有没有勾选Include in Target Build以及有没有单独指定编译器。默认情况下所有文件跟随全局设置但老工程里可能有人手动指定过。另外两个常见混用问题工程A和工程B在一个workspace里A用AC5B用AC6Keil全局设置只能支持一个默认编译器。这种情况下需要确保每个工程的Target选项都单独设置了ARM Compiler版本不要依赖全局默认值。不同固件库版本对编译器版本有隐含要求。ST的StdPeriph库在AC5下编译完全正常在AC6下需要加额外的--gnu兼容选项不然头文件里的位段定义直接报错。用AC5就是图个省心。4.4 老工程兼容性与优化建议有些朋友在旧工程上已经做过大量AC6改造代码改了一半才切换到AC5结果发现AC5也报编译错误。这种情况需要先梳理两个编译器的差异点AC5允许在for循环内声明变量AC6也允许但AC5对指针强转的要求比较宽松AC6必须显式typedef或添加__attribute__((packed))反过来AC6是严格语法派喜欢把所有警告当错误处理AC5则有不少#pragma能关掉警告。如果工程里用到了__attribute__((section(name)))这种GCC风格写法在AC5下可能不会按照预期把变量放在指定段。AC5支持的是__attribute__((at(address)))或者__align、__section等关键字。遇到这类问题建议优先查芯片厂商是否提供了针对AC5的移植说明大多数主流厂商从2018年之后的驱动更新已经不再兼容AC5了旧项目用旧库别盲目升级库版本。对了还有一个小技巧在工程的头文件目录里如果同时存在多个版本的CMSIS核心头文件比如core_cm4.hAC5编译时优先使用Keil安装目录下ARM\PACK\ARM\CMSIS路径中的版本。如果你手动添加了AC5后又出现奇怪的CMSIS头文件冲突去这里看看版本号是否匹配。5. 最后一次分享几个小经验写到这里把我在实际使用中觉得最值得强调的经验再唠叨一遍。首先给工程切换AC5后执行以下三步能规避大部分问题Clean Target清掉旧产物关闭Keil重启重新Rebuild。顺序不能反不重启直接Rebuild偶尔会出现编译器路径缓存未刷新的情况。其次如果你用的是MDK 5.38及以后版本每次打开AC5工程时可能会弹一个迁移到AC6的提示框千万别点确认点确认后工程文件会被改写再把编译器切回AC5时部分配置可能丢失。正确做法是点取消或者始终不迁移后续继续用AC5维护。最后安装完AC5后建议把5.06u7的安装包和文档单独存档一份在网盘或NAS上。ARM官网对历史工具链的下载入口调整过不少次有时候某个版本会突然在页面上找不到了。手上有备用的安装包以后给新电脑配环境或者帮同事解决同样的编译报错都能直接派上用场。毕竟AC5目前维护状态已经停止官方不太可能再更新新版本存量资源越往后越珍贵。本文还有配套的精品资源点击获取