十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Keil MDK缺失Arm Compiler 5?详解AC5编译器安装与配置

Keil MDK缺失Arm Compiler 5?详解AC5编译器安装与配置 简介针对KEIL5 MDK工程中出现“Default Compiler Version 5”不可用而报错的开发者这份资源提供了Arm Compiler 5的Windows x86版本安装包Compiler-506-Windows-x86-b960。若在魔术棒Target选项卡的编译器下拉框中显示“missing: compiler version 5”通常意味着MDK未随安装附带经典ARMCC编译器安装本包即可恢复对Version 5编译器的调用使旧版工程或依赖ARMCC的代码重新编译。资源包共3个文件其中msi为编译器安装程序、exe为可执行程序、html为版本发布说明整体约80MB适合KEIL5各版本用户离线安装。由作者shijicuihe分享目前已有5747人学习下载对于维护历史项目或需要指定ARMCC版本进行编译的开发者能直接解决工具链缺失问题省去自行寻找匹配版本的麻烦。安装后可正常选择Compiler 5并建议结合工程实际情况核对编译器路径设置。 搞嵌入式开发的估计都遇到过这种场景同事丢过来一个STM32老工程你兴冲冲用Keil MDK打开F7一下窗口直接刷红——“Cannot find Compiler Version 5”。再点开工程属性一看Target页里指定的是Arm Compiler 5而你新装的MDK 5.37以上版本默认只带V6编译器。这种时候最省事的解决办法就是找到那个经典的VS编译器离线包Compiler-506-Windows-x86-b960。这个安装包到底解决什么问题为什么老项目死活离不开它装完之后怎么在MDK里切过去以及常见的坑有哪些这篇就按我这几年的实际经验一次性讲清楚。1. 搞懂这个安装包名字里藏了哪些信息1.1 逐段拆解版本号先把这个看起来很长的文件名拆开看其实信息很直白Compiler说明这是ARM官方发布的编译器工具链不是IDE本身也不是调试器驱动。506指Arm Compiler 5.06系列。这是ARM公司早期的桌面编译器产品线5.06是AC5的最后一个大版本后续的5.06 update 4、update 5、update 6、update 7都属于它。Windows-x86宿主系统是Windowsx86表示这个程序包是为x86/x64 Windows准备的。很多新手看到x86就慌其实Keil MDK本身就是32位应用64位Windows装这个完全没问题。b960build号也就是编译构建编号一般对应某个update版本。不同渠道下载到的build号可能不一样但只要主版本是506编译器内核都是同一套armcc工具链。我印象里装完这个包之后打开MDK的安装目录会看到类似C:\Keil_v5\ARM\ARMCC\bin这样的路径里面躺着armcc.exe、armasm.exe、armlink.exe、fromelf.exe这些可执行文件。armcc就是C/C编译器armasm是汇编器armlink是链接器fromelf用来输出hex/bin或反汇编文件。整个AC5工具链就靠这几个家伙干活。1.2 编译器、IDE、编辑器先分清楚看到热搜词里同时有“编译器开发”和“编译器和编辑器的区别”就知道很多刚入门的朋友在这个概念上容易绕晕。Keil MDK也就是我们常说的Keil5是一个集成开发环境IDE它负责工程管理、代码编辑、调试下载这些事而Compiler 5.06是这个IDE背后的编译工具链负责把C/C代码翻译成机器指令。两者是“外壳”和“引擎”的关系缺一不可。编辑器和编译器的区别更简单编辑器就是记事本这类写代码的工具你可以在VS Code里写代码但没有编译器你写出来的代码没法变成能跑的程序编译器则不管你打字爽不爽只负责翻译代码。Keil MDK内置了编辑器但编译这步必须依赖外挂的Arm Compiler工具链这就是为什么这个离线安装包如此重要。1.3 这个包里到底有什么安装包本身不大百来MB的量级。装完后它会在MDK的ARM目录下生成一个完整的编译工具链和配套文件包括armcc、armasm、armlink等核心程序带版本的头文件库和标准库C库、C库的嵌入式版本浮点库、RTOS相关的一些支持文件ARM/CMSIS相关的部分支持文件所以这不是一个“补丁”或者“插件”而是一整套完整的工具链。单独装它的时候它会自动寻找MDK安装目录装进去之后MDK就能在编译器下拉框里看到V5的选项。2. 为什么要装AC5新旧编译器之争2.1 老工程兼容性是第一生产力很多刚从学校出来或者刚接触Keil的朋友会问MDK新版本默认带的是Arm Compiler 6为什么非要折腾一个老掉牙的V5答案就四个字工程兼容。在AC5时代大量STM32标准外设库、老版本Cube库、某些开发板厂商封装的底层驱动都是在AC5下按旧语法写的。换到AC6之后由于编译器前端换成了Clang/LLVM对C语言标准、汇编语法、类型检查都更严格老代码经常会冒出一堆警告甚至error。比如隐式类型转换以前警告一下现在直接报错变量声明位置必须在语句前AC6放宽但在某些优化选项下照样有歧义宏定义里的空参数、旧式的函数声明统统不友好你可能会说“新项目用AC6就行”但在产品维护场景里一个稳定跑了三五年的老项目哪怕只是加个小功能也没人愿意花一两个星期去解决编译兼容问题。最稳妥的方案就是老工程保持AC5新工程再用AC6。这也是我电脑里一直留着AC5的原因。2.2 汇编语法和代码风格差异AC5和AC6差异最大的地方其实是汇编部分。AC5的armasm使用传统ARM汇编语法比如伪操作是AREA、DCD、LDR这些老工程师看着很亲切AC6改用armclang默认支持GNU风格汇编伪操作变成.section、.word、.syntax unified这类。如果你的启动文件或底层驱动还是老式写法在V6下编译基本就是灾难现场红色error一大片。C语言层面AC5对旧标准更宽容默认用C90也能编译过AC6则更贴近现代编译器对代码规范要求更高。同样是for(int i0;...)这样的写法AC5在C90模式下会警告甚至报错AC6则完全支持。反过来老代码里常见的“函数声明多余参数”“指针类型随意转换”这类写法AC6直接不给面子。2.3 许可证与成本问题AC5编译器本身在使用上跟MDK的License绑定。只要你的MDK有正版授权或评估LicenseAC5就可以正常使用不需要额外的独立许可证。很多人只知道MDK需要破解或刷License这里建议走正规渠道去Keil官网注册一个评估License或者通过学校、公司获取正版授权否则编译器会提示License错误无法编译。我见过很多同学折腾各种“注册机”最后不但问题没解决系统还被报毒得不偿失。3. 安装与配置从下载到编译一条线3.1 下载前的准备工作安装这个包之前先确认两件事你的MDK版本是否支持AC5。理论上MDK 5.x全系列都支持但从MDK 5.37开始官方不再把V5编译器默认打包进安装包而是要求单独下载。这正是我们需要Compiler-506-Windows-x86-b960的原因。你的工程文件里编译器选项是不是明确选择了V5。如果工程是别人给的先打开Options for Target看一下。下载的时候注意来源尽量从ARM官方或者可信渠道拿文件有的第三方镜像站会捆绑改版文件。下载后可以先校验一下文件哈希不确定的包宁可不装也别乱试。3.2 安装过程与注意事项安装过程非常简单双击exe按向导走就行。但有几个细节值得注意安装路径默认会指向你现有的MDK安装目录比如C:\Keil_v5不要改到别的地方否则MDK可能找不到工具链。如果电脑里同时装了C51版Keil和MDK安装AC5时选MDK目录别装错到C51里。安装完别急着打开工程建议先重启一下MDK让IDE重新扫描编译器路径。有时候会出现“安装成功但MDK还是找不到V5”的情况多半是路径对不上。这时可以检查C:\Keil_v5\ARM下面有没有ARMCC目录没有的话就手动把工具链拷过去或者重装一遍。3.3 让MDK选中AC5关键步骤安装完成后在MDK里打开目标工程按下图路径设置Project → Options for Target → Target → ARM Compiler在ARM Compiler下拉框里选择Use default compiler version 5或者直接选中具体的V5版本号。如果下拉框是灰的或者只有Version 6说明MDK没识别到AC5回到3.2检查安装目录。这里有个小技巧一个工作区里可以同时存在多个工程每个工程可以独立选择不同的编译器。也就是说老工程用AC5新工程用AC6两者完全可以共存不需要反复切换安装包。3.4 验证编译器是否生效配置好之后编译一个最简单的小工程比如点灯然后看Build Output窗口的第一行。如果出现类似这样的一行*** Using Compiler V5.06 update 7 (build 960), folder: C:\Keil_v5\ARM\ARMCC\bin说明AC5已经被正确加载build 960就是对上了我们安装的版本号。接下来的编译输出里的警告和错误风格也会变成AC5特有格式。如果没有这一行或者报“No such compiler”那就得回头检查了。4. 常见问题与探索实录4.1 找不到编译器怎么办这是安装AC5最经典的报错表现形式有很多种编译时说armcc is not recognized或者在Options里看不到Version 5甚至打开工程直接弹窗说缺少编译器。排查思路按这个顺序来检查C:\Keil_v5\ARM\ARMCC\bin下有没有armcc.exe没有就是没装上或装错路径。检查MDK版本如果太老比如MDK 4.xAC5的安装包可能不识别这种情况建议升级MDK。检查系统用户权限某些公司电脑装了权限控制安装程序没写进Program Files也会导致MDK扫描不到。如果以上都正常可以把MDK安装目录下的TOOLS.INI文件打开看一眼里面应该有ARMCC相关的路径条目。缺了的话可以手动补但更推荐重装一遍AC5省事。4.2 中文路径和空格问题Keil对中文路径的支持一直算不上好AC5时代尤其明显。如果你把工程放在D:\项目\demo这种路径下编译时经常报一些莫名其妙的错误比如打不开头文件、找不到目标文件。这跟编译器读取路径的方式有关英文路径下基本没这个问题。我个人的习惯是所有工程路径一律用英文不要有中文、空格、特殊符号。这不是洁癖是踩过坑之后的血泪教训。如果公司文件服务器上的路径改不了那至少要在本地拷一份到纯英文路径下编译。4.3 License不识别或提示未激活AC5编译时如果提示License相关错误首先要确认MDK本身的License是有效的。因为AC5的授权是和MDK绑定的并不是单独再激活一次。如果你用的是评估License编译时会在输出窗口里看到一行提醒说使用的是评估版、生成的代码有大小限制这属于正常现象。还有个小坑部分杀毒软件会把armcc当成可疑程序隔离导致编译时突然报“找不到编译器”。遇到这种情况把MDK安装目录加入杀毒软件信任列表即可。4.4 编译通过但不兼容的坑有时候AC5装好了编译也过了但生成的固件就是运行不正常。这种问题最隐蔽我遇到过的情况主要有两种一是AC5和AC6生成的代码在内存布局上有细微差异尤其涉及中断向量表和启动文件时可能因为启动文件版本和库的版本不匹配导致上电跑飞。解决办法是确保启动文件和CMSIS库版本跟编译器匹配建议统一用Keil自带的版本而不是自己从网上乱拷。二是浮点运算行为不一样。AC5默认的浮点模型和AC6有差别如果老工程里用到了浮点运算但没正确配置FPU选项就会出现“明明编译没错误实际输出值不对”的诡异问题。检查Options for Target里的Floating Point Hardware选项跟芯片型号匹配确保AC5也开了硬件浮点。5. 关于C51、VS Code和工程迁移看到热搜词里有“keil5兼容C51和STM32安装”“keil5 vscode”这里顺便说两句。Keil C51和MDK是两套不同的开发环境C51用来玩51单片机MDK用来搞STM32这类ARM内核芯片两者所需的编译器完全不同。C51用的是C51编译器不是我们说的AC5。所以如果你既要写51又要写STM32正确做法是分别安装C51版Keil和MDK它们可以装在同一个Keil安装目录下互不干扰。MDK的AC5编译器不能用于51单片机这点别搞混。至于VS Code和Keil的关系很多朋友喜欢用VS Code当编辑器再用Keil当编译器。这个思路没问题VS Code只负责改代码编译下载仍然走MDK的命令行工具。AC5安装之后armcc.exe这些命令行程序可以在命令行里直接调用配合CMake或脚本也能搭出一套命令行构建流程。不过新手的话还是先在MDK界面里把环境摸熟再考虑折腾VS Code否则调试器配置、下载器配置这些坑叠加起来容易劝退。另外很多老工程要想升级到AC6也不是非得一键切换。稳妥的做法是先用AC5跑通老工程确认功能正常再逐步解决新编译器下的编译问题。毕竟一次一个大版本切换风险太高步子大了容易扯到蛋。6. 我的一点建议用AC5这么多年最核心的体会是编译器只是一个工具稳定可靠比什么都重要。AC5虽然在优化和新标准支持上不如AC6但对于老工程的长期维护它依然是不可替代的角色。最后分享一个实用技巧如果你经常需要在AC5和AC6之间切换建议在MDK里建一个专门的“编译器测试工程”里面放几个不同风格的测试用例——一个纯C的老式函数写法、一个带汇编启动文件、一个有浮点运算的例子。每次装完新环境先编译这个测试工程看能不能一次通过。通过说明编译器环境OK不通过趁早排查别等到真正动工的时候再被环境问题拖后腿。本文还有配套的精品资源点击获取
返回列表