尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Keil MDK 5.37后AC5编译器消失?离线安装与老工程兼容指南

Keil MDK 5.37后AC5编译器消失?离线安装与老工程兼容指南 用Keil MDK做嵌入式开发的老手最近应该都有同一个感受升级到5.37之后AC5ARMCC v5编译器好像“凭空消失”了。打开以前的STM32、GD32、NXP老工程一编译就是满屏的Toolchain not installed或者compiler not found折腾半天才明白原来从5.37开始Keil官方默认只装AC6armclang而不把AC5armcc一起打包了。这篇文章就把5.37及之后版本里AC5编译器最干净的安装方法、离线包选择、常见报错和迁移老工程时的注意事项一次讲清楚给还在维护老项目、或者暂时不想折腾AC6的朋友一条能直接照抄的路。1. 为什么5.37之后AC5不再默认安装1.1 官方到底改了什么Keil MDK从5.37版本开始安装包结构出现了明显变化。过去我们装完MDK打开安装目录ARM\ARMCC\bin下面能直接看到armcc.exe、armasm.exe、armlink.exe这一套完整的AC5工具链。但5.37之后装完默认只有ARM\ARMCLANG\bin也就是AC6编译器armclang。MDK的安装器也特别“贴心”如果你安装了旧版本的AC5升级到5.37时它还会提示AC5已不再作为默认组件让你手动处理。有些新人到这里就开始慌以为是安装过程出了问题卸载重装好几次还是找不到AC5。其实这不是你操作的问题这是Keil官方主动做的“断舍离”。ARM编译器v5.06 update 7build 960是AC5的最后一个版本官方早已停止更新后续的维护精力全部放在了AC6上。所以你从5.37开始找不到AC5不是安装坏了是它根本就没给你装。1.2 哪些场合还离不开AC5既然AC6是官方主推的编译器为什么还要专门写一篇AC5的安装教程因为现实项目里AC5是“钉子户”一样的存在。第一类老工程不兼容。很多芯片厂家的标准外设库、早期SDK、老版本RTOS例程都是基于AC5的语法和编译行为开发出来的。像STM32标准外设库StdPeriph、早期LPC17xx/LPC18xx的驱动直接拿到AC6下编译经常因为语法差异报一堆错比如结构体初始化方式、编译器内建关键字、汇编文件格式等等。维护这种老工程最稳的办法就是继续保持AC5编译环境而不是花一两天时间去改代码。第二类部分国产芯片和中小厂商的SDK。不少国产MCU厂商的库函数代码内部用了很多AC5风格的关键字比如__asm、__forceinline、__align、__packed这些。虽然AC6也支持大部分但遇到个别冷门关键字或内联汇编写法编译直接报错。遇到这种情况与其改库不如给工程配上AC5一分钟解决。第三类封装好的中间件。有些第三方闭源库只提供AC5编译好的静态库.lib没有源码这种情况下你只能用AC5去链接。没了AC5整个工程就跑不起来。所以AC5不是“淘汰的思路”而是很多存量项目和特定开发场景下的刚需。这也是为什么5.37之后手动安装AC5成为一门必会的操作。2. 安装AC5之前要准备什么2.1 确认当前MDK版本和架构在安装AC5之前先确认你的Keil MDK版本。我这里的操作示例基于5.37、5.38、5.39这几个版本整体流程一样但个别细节比如Pack Installer的界面文案略有差异。打开Keil MDK点击菜单栏的Help - About uVision可以看到版本号。重点关注版本号是不是5.37及以上如果是5.36及以下那AC5一般默认就在或者安装包直接包含不太需要这篇文章。还要注意操作系统位数。MDK安装路径默认是C:\Keil_v5如果你的系统是64位安装目录没什么特别要求但如果你用了绿色版、精简版或者其他第三方打包的MDKAC5安装路径可能被改掉后面配置路径时要格外小心。在动手之前我强烈建议先关掉杀毒软件至少把Keil安装目录加入白名单。AC5安装程序会在C:\Keil_v5\ARM\ARMCC底下注册很多可执行文件和动态库某些杀毒软件会把armcc相关的DLL当成风险项拦掉导致装完之后编译器不可用。这个坑我踩过一次装完没有任何报错但一编译就说找不到编译器最后发现是被杀毒软件“隔离”了。2.2 找到正确的AC5安装包AC5编译器分两种方式获取一种是通过MDK自带的Pack Installer联网下载安装另一种是下载离线安装包手动装。两种方式我都会在下一节详细讲这里先说清楚离线包的事情。Keil官方的AC5最终版本是ARM Compiler 5.06 update 7 (build 960)这个版本号非常重要。网上有些老教程让你去下载5.06 update 5、5.06 update 6这些旧版本虽然也能用但既然有update 7就一定要用这个最终版。它修复了update 6之前的一些已知问题生成的代码稳定性更好。离线包一般是一个压缩包或者可执行文件文件名大概是ARM_Compiler_5.06_update_7.zip或者DS0000_ARM_Compiler_5.06_update_7.zip。这个包在Keil官网的“Legacy Product Downloads”页面可以找到搜索的时候直接用“ARM Compiler 5.06 update 7 (build 960)”这个完整关键词。下载完之后放在一个干净目录里比如D:\tools\AC5全程不要解压安装时把目录搞乱。顺便提醒一句网上有些“搬运版”AC5安装包压缩包里的文件被改过安装完之后可能带后门或者静默装其他软件。我一般只认准两个来源Keil官网下载链接以及芯片厂商官方技术社区里挂载的官方转存链接。从其他渠道下载的包先比对一下文件大小官网的包大小一般都在几百MB级别如果下载下来一看只有几十MB那基本可以删了。3. AC5编译器的详细安装步骤3.1 通过Pack Installer自动安装这是最稳、最省事的方式前提是网络状况正常能访问Keil的下载服务。这个方法不需要你去官网找链接也不用纠结解压到哪几步就能完成。第一步打开Keil MDK的Pack Installer。在uVision界面里菜单栏点Pack Installer图标一个绿色方块图标或者通过Tools - Pack Installer打开。第二步在Pack Installer窗口里找到左侧工具栏或者菜单里的Tools - Manual Install ARM Compiler。这个选项的准确名字在不同的MDK版本里略有差别有的叫Manage ARM Compiler有的直接叫Manual Install ARM Compiler但位置都在Pack Installer的菜单栏里。第三步点击之后会弹出一个对话框里面列出了当前可安装的ARM编译器版本。选择ARM Compiler 5.06 update 7 (build 960)如果列表里没有可能是你的MDK版本较新界面上会有“Download”按钮先点击下载下载完成后会自动弹出安装程序。第四步安装程序会询问安装目录。这里我建议直接保持默认也就是MDK的安装目录比如C:\Keil_v5。安装完成后AC5会被装到C:\Keil_v5\ARM\ARMCC这是Keil默认识别路径后面配置工程时省很多事。在联网安装过程中我发现一个规律如果你公司网络对境外下载不友好这一步很容易卡在“Downloading”然后超时。这时候不要反复重试直接改用下一节的离线包方案反而节省时间。3.2 离线包手动安装与路径处理离线包是很多开发者的救星尤其当你帮同事装环境、或者给不能联网的客户部署开发环境时这个方法最靠谱。拿到离线包后先解压或者直接双击运行。如果是一个zip压缩包解压后里面会有类似install_armcc.bat或者setup.exe的安装脚本如果是.exe文件直接双击运行即可。运行方式有讲究建议“右键 - 以管理员身份运行”因为AC5要写入MDK安装目录普通权限下可能提示无权写入Program Files下的Keil_v5目录。安装程序跑完之后打开MDK的安装目录重点确认目录结构。正常情况下你的MDK根目录下应该同时存在ARM\ARMCC和ARM\ARMCLANG两个文件夹分别对应AC5和AC6。如果ARMCC文件夹没生成说明安装过程出了问题可能是指定的安装目录不对。这时候手动把ARMCC文件夹放到C:\Keil_v5\ARM下然后去环境变量相关配置里看看路径有没有被识别。不过手动挪目录属于“险招”能不用就不用尽量通过安装程序正常装到默认位置。还有一个离线安装的常见场景我手头有个5.06 update 7的安装包但同事机器上的MDK主程序改过安装路径装在了D:\Keil_v5_Pro。这种情况下安装程序也能识别但有个技巧一定要在第一步选择“Customize”并手动指定到D:\Keil_v5_Pro\ARM而不是让安装程序默认往C:\Keil_v5里塞。装完之后打开MDK在工程配置里手动添加一下编译器路径即可下面会说。3.3 安装后的确认与工程切换装完AC5怎么确认它真的被MDK识别了这一步不能省否则后面编译老工程很可能依然报错。先打开一个工程或者新建一个空工程然后看左侧Project窗口右键点击目标选择Options for Target快捷键是AltF7。在弹出的对话框里切到Target标签页最上方有一个ARM Compiler的选项框。点开这个下拉框正常情况下会看到一个类似Version 5.06 update 7 (build 960)的选项。选中它然后点击OK。这时候再编译如果AC5被正确识别工程会用armcc来编译而不是armclang。但这里有个特别容易迷惑的地方。如果你的下拉框里只能看到Use default compiler version 6看不到AC5选项并不代表AC5没装成功而是MDK的编译器注册列表里没有添加这个版本。解决办法是在同样的Options for Target对话框里点一下ARM Compiler下拉框旁边的“三个点”按钮或者右键工程 -Manage Project Items - Folders/Extensions在弹出来的ARM Compiler管理界面里选择Add another ARM Compiler然后浏览到C:\Keil_v5\ARM\ARMCC\bin选中armcc.exe或者直接选到ARMCC目录。添加成功后这个版本就会出现在候选列表中。同一台机器上不同工程可以分别选择AC5和AC6MDK是支持的互不影响。这在实际项目中特别实用比如公司有两套代码库一套老一套新都放在同一台电脑上只要在每个工程里手动指定一下编译器版本就行。4. 安装和使用AC5时常见的坑及排查方法4.1 装完了还是提示“Version 5.06 update 7 (build 960)未安装”这是我在社区里看见出现频率最高的报错也是标题热搜里被问烂的那句话。出现这个报错十有八九是AC5的安装路径和MDK的搜索路径对不上。排查分三步。第一步确认C:\Keil_v5\ARM\ARMCC\bin下有没有armcc.exe。如果没有说明AC5根本没装上回去重新安装。第二步打开Options for Target - Target看ARM Compiler下拉框里有没有出现AC5选项如果没有用前文提到的“Add another ARM Compiler”手动添加。第三步添加后还有报错检查MDK版本。有些5.37的精简版、破解版可能阉割了编译器注册功能这时候只能重装一次完整官方版本。还有一个小概率情况Windows系统环境变量里的PATH被某些软件改过导致MDK找不到armcc的路径。这时候可以在系统环境变量里手动加一条C:\Keil_v5\ARM\ARMCC\bin然后重启MDK问题一般能解决。4.2 编译时报告找不到头文件core_cm3.h、stm32f10x.h等这个问题看着像AC5没装好其实往往是CMSIS和Device Family PackDFP的版本问题。AC5本身只带编译器和标准库芯片相关的头文件、启动文件来自两个地方一是芯片厂商的PACK包二是Keil自带的CMSIS库。升级MDK之后工程里的CMSIS路径可能因为版本变化被重置了或者PACK包的版本和你工程的旧代码不匹配。解决办法打开Options for Target - C/C标签检查Include Paths是否还指向老路径。再打开Pack Installer确认你需要的芯片PACK包比如Keil::STM32F1xx_DFP已经安装并且版本号不要选太新。有些老工程在某些新版本DFP下头文件反而找不到退回旧版DFP比如1.1.0能立刻解决问题。这里分享一个经验老工程尽量不要盲目升级DFP。芯片PACK包和IDE编译器是独立更新的但新PACK包里的启动文件可能默认用AC6风格编写老工程配AC5编译反而出问题。遇到底层头文件、启动文件报错的先尝试把DFP版本回退到你项目当初开发时对应的版本而不是追新。4.3 编译不报错但链接时报一堆“Undefined symbol”这个问题更隐蔽。AC5编译器和AC6编译器的宏定义规则有些差异。比如老工程里可能用到了__CC_ARM、__GNUC__这类编译器识别宏或者某个库函数的条件编译指令靠这些宏来开关。当编译器从AC5换成AC6这些宏可能失效导致某些配置项被跳过最终链接时找不到对应的函数实现。表现就是编译阶段一路过到了链接阶段突然冒出一堆Undefined symbol比如SystemInit、HAL_UART_Init之类的。排查思路先在工程里全局搜索__CC_ARM这个宏是AC5特有的如果代码或启动文件里有它说明这部分逻辑是为AC5写的。如果编译器切到AC6__CC_ARM不定义相关代码就不参与编译。解决方法是在Options for Target - C/C - Define里加上__CC_ARM1或者把条件编译改成兼容AC6的写法。反之亦然当你用AC5时如果某些代码依赖__CLANG_ARM宏也需要手动添加。4.4 报错“编译器未包含main类型”看到“编译器未包含main类型”这句话时很多人第一反应是编译器坏了其实大概率是工程配置里选错了编译器选项或者编译器路径指向了一个不存在的编译工具。这个报错一般出在Options for Target里选择了某一个“编译器版本”但那个版本的安装路径指向了一个不含armcc的目录比如你把ARM Compiler路径指到了ARMCLANG的bin目录它当然没有“main”编译能力。解决办法很简单把ARM Compiler路径重新指到ARMCC\bin然后确认下拉框里选中的是AC5而不是AC6。还有一种情况这个报错出现在第三方IDE比如VSCode的嵌入式插件里本质是工具链配置指向错误。如果你不在MDK里用而是用VSCode做开发那要检查c_cpp_properties.json或者tasks.json里的compilerPath确保它指向armcc.exe的绝对路径。5. AC5和AC6共存以及老工程维护建议5.1 共存配置注意事项AC5和AC6共存是完全可以的MDK从5.37开始就是按这个思路设计的。两者安装在不同目录编译时互不干扰。但要注意同一个工程如果来回切换AC5和AC6编译产物可能混在一起。我的习惯是给每个工程单独配置Output目录在Options for Target - Output里把Objects、Listings文件夹区分开比如Objects_AC5和Objects_AC6。这样切编译器的时候不会把中间文件、链接映射文件搞成一团排查问题也方便。另外使用AC5编译老工程时我强烈建议在Options for Target - C/C - One ELF Section per Function这个选项上保持默认“off”因为有些老代码依赖跨模块的弱符号和垃圾回收机制开了一不小心链接出来就是几百KB的差量没必要在某些资源不紧张的场景下折腾。还有其他细节如果你同时安装了几个版本的AC5比如开发机上是5.06 update 6客户机上装了update 7那MDK的配置里要保证工程文件里的编译器版本号和实际安装的一致。工程文件.uvprojx里的ArmAdsMisc节点会记录编译器版本信息但一般不用手动改MDK打开工程时会自动匹配。5.2 给还在维护老工程的开发者几点心得说句掏心窝子的话AC5最终版5.06 update 7已经非常成熟稳定性极好配合老库跑十几年的工程完全没问题。我这边好几个量产项目还在用AC5只要芯片型号没变、编译器版本锁定真的没必要为了“升级”而去升级。但在新项目上我建议你谨慎使用AC5。AC6这些年也越来越成熟支持C11、C11还有更多的优化选项代码紧凑程度比AC5强不少新工程的竞争力肯定更高。说白了AC5现在的定位就是“兼容存量”而不是“面向未来”。如果你计划在两三年内把老工程迁移到AC6这里给一个排序建议先把工程代码里的编译器和库版本固定下来逐个模块对照__CC_ARM条件编译进行修改先让整个工程在最低优化级别下通过AC6编译再逐步提升优化等级。迁移过程中AC5和AC6共存可以很好地兜底哪个模块出问题就临时切回AC5编译不至于让整个开发中断。我个人在实际使用中感受最深的反而是“固定版本”这四个字。做嵌入式开发的人都知道一次“看似无关紧要”的升级可能在半年后某个量产问题排查时给你挖一个天坑。AC5时代之所以很多老工程师能闭着眼睛改代码就是因为编译器行为足够稳定。安装AC5不是目的守住工程的可复现性才是关键。所以无论你是新装MDK 5.37、5.38还是正在帮客户搭开发环境把AC5装好并锁死版本老项目就不会因为“编译器不对”而寸步难行。
返回列表