ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Keil MDK安装ARM编译器6.21独立版全流程:解决64位兼容与版本不匹配

Keil MDK安装ARM编译器6.21独立版全流程:解决64位兼容与版本不匹配 简介面向Keil MDK 5用户的ARM Compiler for Embedded 6.21离线安装包专为Windows 64位环境优化内置MSI主安装程序、许可管理工具及多种法律文件。安装后可在uVision 5中直接设为默认C/C编译器无需在线激活或额外依赖兼容AC6语法标准支持ARMv6-M至ARMv8-A架构轻松编译Cortex-M/R/A系列嵌入式工程覆盖STM32、NXP LPC、Renesas RA等主流MCU。压缩包共10个文件除核心MSI安装包外还包含txt格式的许可协议、补充条款、可再分发组件列表与第三方开源许可证声明html版更新日志及版权说明整体约322.7MB目录结构清晰。包内附带redistributables、third_party_licenses等多份合规文档帮助开发者确认再分发条件适合企业内网离线部署与合规审计。目前已有115人学习本资源适合从AC5迁移到AC6、或需要独立部署ARM编译链的嵌入式开发者快速上手。安装后无需重启即可替换旧版编译器可直接用于实际项目编译验证。 做嵌入式这几年Keil MDK 是绕不开的但真正把它折腾明白往往是等你在新电脑上重新搭环境的时候。上一周帮同事处理一个编译报错源工程说明里写着“使用 ARM 编译器 6.21 编译”而新装的 MDK 5 默认只带了个老版本编译器一编译全是语法差异和警告。搜索一圈发现最省事的办法是直接装一个 ARM 编译器 6.21 独立安装版Windows 64 位环境下手动挂到 Keil MDK 5 里使用。这篇文章就是我这次从下载、安装、报错排查到最终验证的全过程记录里面有踩过的坑也有可以直接照抄的步骤。如果你也遇到过 MDK 自带编译器版本和工程要求对不上或者安装时被“64 位 Windows 不兼容”直接劝退这篇应该对你有用。1. ARM编译器6.21独立版解决的不是“有没有编译器”的问题1.1 MDK自带编译器版本和工程要求对不上怎么办很多新手以为 Keil MDK 装好了ARM 编译器就只有一个其实不是。每个版本的 MDK 安装包都会捆绑一个特定版本的 Arm Compiler而且早期 MDK 还可能同时带 AC5 和 AC6 两套。不同版本之间的差异小到警告的提示风格大到默认的 C 语言标准、内联汇编写法都会导致同一个工程在 A 电脑上编译通过、在 B 电脑上报错。接手工程多了之后你会发现不少项目在说明文档里明确写了“使用 ARM Compiler 6.21 编译”。这类工程通常是比较新的 SDK 或 BSP作者用新编译器做过完整验证。你本机 MDK 自带的编译器版本如果比它低编译产物行为就可能和作者不一致如果比它高又可能引入一堆新警告。最靠谱的方式就是安装与工程要求一致的编译器版本。这也正是 ARM Compiler 独立安装版存在的意义把编译器从 MDK 中解耦出来需要哪个版本就装哪个版本而不是为了一个编译器去重装整个 MDK。1.2 AC6与AC5为什么独立版都在追新版本号AC6 全称 Arm Compiler 6核心工具是 armclang底层基于 LLVM/Clang 架构AC5 用的是 armcc是 Arm 自己早期的编译器。MDK 从 5.25 左右开始力推 AC6后续新版本默认都优先用 AC6。AC6 对 C99/C11 的支持明显更好编译优化的代码体积往往也比 AC5 好看但它的语法检查更严格老项目直接切过去会产生大量警告甚至错误。ARM Compiler 6.21 属于 AC6 系列里比较新的稳定版本对 Cortex-M 全系支持都很稳定最关键的是很多开源工程和 CMSIS 软件包已经按这个版本做过验证。所以大家才愿意专门找 6.21 来装而不是随便用 MDK 自带的旧版。独立安装的方式又让编译器不再跟着 MDK 版本走你可以在工程属性里自由切换 AC6.21 和其他版本这对同时维护新老项目的工程师来说比“装一个新版 MDK”要优雅得多。2. 动手安装之前先把系统和已有Keil版本盘点清楚2.1 确认Windows 64位与安装包匹配ARM Compiler 6.21 独立安装版提供的是 Windows 64 位版本。装之前一定先确认系统是 64 位右键“此电脑”选属性或者 WinR 输入 dxdiag看系统类型是不是“64 位操作系统”。如果系统是 32 位就别折腾了装不上。反向来说64 位 Windows 可以运行 32 位程序但 ARM Compiler 6.21 的 64 位安装包不会让你想在 64 位系统上遇到什么障碍问题往往出在其他环节。另外下载完安装包以后先看一眼数字签名。右键文件、属性、数字签名确认签名正常。这个小动作能过滤掉很多下载源被劫持或文件传输损坏的情况。我习惯在下载工具里对比一下文件大小和官网标注是否一致如果差几十 MB那基本可以断定包没下全直接删了重下别浪费时间双击试错。2.2 同一个电脑能不能装Keil 4、C51和MDK先说结论这也是很多人反复问的问题同一个电脑可以装 Keil 4 和 Keil C51 和 MDK 吗答案是可以共存但前提是安装目录必须分开。C51 是给 8051 单片机用的工具链MDK 是给 Arm 用的两者项目完全不同装在一起互不干扰。老 Keil 4ARM 版和新 MDK 5 反而有风险因为它们的 IDE 核心都叫 UV4如果安装时选了同一个目录关键动态库会被互相覆盖最后两边都打不开工程。我建议的目录安排是C51 装到 C:\KeilMDK5 装到 C:\Keil_v5老 Keil 4 尽量不碰或者装到独立目录里只读工程用。这样每个版本的配置文件和工具链都独立启动各自 UV4.exe 时不会串。装 ARM Compiler 6.21 独立版时也同样思路往 MDK 自己的 ARM 工具链目录里放不给后面的路径检索添乱。2.3 安装目录的选择避开UAC踩坑区ARM Compiler 独立安装版默认安装路径可能在 C:\Program Files 下但实际工程中我不建议放这里C:\Program Files 经常因为 UAC 权限问题引发各种诡异报错比如安装时提示写文件失败或者 MDK 调用编译器时找不到临时文件。个人习惯是直接放到 C:\Keil_v5\ARM\ARMCLANG这样 MDK 在挂载编译器时能自动识别命令行使用时路径也短。此外路径里尽量不要有中文和空格。很多集成环境的脚本在解析带空格路径时容易出问题尤其是老版本的批处理或者 makefile一旦找不到 armclang.exe排查起来非常痛苦。这点在 Windows 下做嵌入式工具链的人应该都有共鸣能规避的坑就不要用自己的时间去踩。3. 独立安装版详细安装步骤与每个选项的含义3.1 下载、校验、运行安装向导ARM Compiler 6.21 独立安装版通常是一个几百 MB 的 exe 文件从官方渠道能直接下载。下载完成后右键属性查看数字签名有条件的再校验一下 SHA256不要从陌生小站下载所谓绿色版、破解版工具链这种东西一旦被植入奇怪的东西你编译出来的固件可能都不干净。双击运行安装向导第一页是许可协议同意后进入下一步。整个过程和普通 Windows 软件安装没太大差别但有一个关键动作如果当前 Windows 账号不是管理员建议直接右键 exe以管理员身份运行。安装程序有时需要写系统环境变量或系统目录权限不足会在没有任何明确提示的情况下中断或部分安装后续使用时报各种无法找到文件的错。管理员权限不是万能但能排除一大半权限类问题。3.2 组件与路径选项怎么选安装向导里一般会问安装类型默认是完整安装包含 armclang、相关库文件和帮助文档保持默认即可。关键还是路径选择建议手动改成 C:\Keil_v5\ARM\ARMCLANG这样安装完后 MDK 启动时能自动扫描到这套编译器不需要你再去配置繁琐的路径。如果你选择装到独立目录后续 MDK 也能通过手动指定路径来识别但每次换电脑或者换目录都要重新设置一遍不够省心。需要留意的是AC6.21 和 AC5armcc的安装目录不互相覆盖它们是两套独立的工具链。如果你的老工程还依赖 AC5建议保留原 AC5 目录不要删MDK 可以同时登记多个编译器在工程属性的 Code Generation 里按需切换。我见过有人装了 AC6 后把 AC5 卸载了结果一个五年前的项目编译不了又花一晚上找旧安装包这个教训不值得重复。4. “此程序与64位Windows不兼容”报错从报错现场到根因4.1 报错真实场景还原帮同事装的时候第一轮双击安装包就直接弹窗“此程序或功能与 64 位版本的 Windows 不兼容”下面跟着一行临时文件路径类似 C:\Users\用户名\AppData\Local\Temp。很多人的第一反应是系统出问题了其实这个提示在 ARM Compiler 这种正经软件上出现大概率不是系统不兼容而是安装包启动过程被某个环节干扰了。那个临时路径是线索。安装程序在真正执行安装逻辑前会把自身或必需的安装组件解压到系统临时目录里再从这个目录启动。如果临时目录被清理软件锁住、权限不对或者里面残留了同名的旧文件安装程序就会误判为当前 Windows 版本不兼容直接给你一个看起来很吓人的报错弹窗。4.2 逐步排查临时文件、杀毒软件、安装包完整性遇到这个报错按顺序走一遍排查基本都能定位先把安装包从下载目录、网盘同步目录里挪出来放到 D:\tools 这种纯英文短路径目录不要在 Temp 目录里运行。如果机器装了第三方杀毒软件或 Windows Defender临时关闭实时防护再重新运行安装包。清理临时目录WinR 输入 %TEMP% 把能删的临时文件清一遍特别留意有没有安装程序的残留目录。右键安装包用“兼容性疑难解答”跑一次让系统自动选择兼容设置。以上都不行重新下载安装包并校验 SHA256。这个顺序其实就是按照“文件本身没问题、环境没问题、权限没问题”的思路逐层排除。整个过程大概十分钟多数情况下在第二步或第三步就能解决。4.3 为什么管理员权限和纯英文路径能解决大部分问题这类报错的根因往往是安装程序的引导阶段在 64 位 Windows 上触发了很多老代码路径的兼容性问题特别是遇到 UAC 重定向和临时目录权限不足时它无法准确报出真正原因只能笼统提示“不兼容”。管理员权限能绕过部分 UAC 限制纯英文路径则避免安装程序内部脚本在路径解析时出错。这个经验不只是 ARM Compiler 适用很多老牌工业软件的多版本安装包都有类似问题。所以不想反复折腾的话从一开始就用管理员身份运行、把安装包放到纯净路径命中这个报错的概率会极低。我遇到不少次这种弹窗最后都是因为“双击之前没有给足权限”或者“临时目录被清理工具锁了”。5. 验证安装是否真正生效命令行和MDK工程双重验证5.1 armclang --version命令行验证安装完成后先别急着打开 MDK用命令行验证最直接。WinR 输入 cmd切到安装目录下的 bin 文件夹比如 C:\Keil_v5\ARM\ARMCLANG\bin然后执行armclang --version正常情况下第一行会显示 Arm Compiler 6.21后面跟着 target 信息。如果提示找不到命令可能是目录不对也可能没有在 PATH 里直接 cd 到 bin 目录再执行通常就没问题。也可以把 bin 目录加到系统 PATH 里但嵌入式开发一般不需要MDK 自己会定位编译器路径。5.2 在MDK工程里挂载ARM Compiler 6.21打开 MDK进入 Project - Manage - Project Items切到 Folders/Extensions 选项卡在编译器相关位置填入安装路径。如果是按本文建议装到了 C:\Keil_v5\ARM\ARMCLANGMDK 可能已经自动识别不需要手填。确定后打开任意一个工程进入 Options for Target - Target在 Code Generation 的 ARM Compiler 下拉框里应该能看到 6.21选中后点确定重新编译。如果下拉框里没有 6.21说明当前 MDK 版本偏旧。较老的 MDK 不认识太新的编译器这需要升级 MDK 主程序或者在官方文档里确认一下当前 MDK 版本对 ARM Compiler 6.21 的支持范围。这一条很关键不然你会以为安装失败其实编译器本身已经装好了只是 IDE 版本太老不给登记。5.3 小工程试编译中AC6的常见兼容点切换编译器后建议先拿一个最小的 main 函数工程验证别一上来就编译大项目。AC6 默认对 C99/C11 支持更好但老代码里常见的隐式函数声明、变量定义位置不规范在 AC6 下都可能从警告变成错误。比如 AC5 时代一些代码习惯在函数体中间定义变量AC6 会严格按照标准检查报 error 而不是提示一下继续编译。遇到这种错误不要慌按照报错提示改成标准声明或者调整 C 语言版本设置很快就能过。第一次切换 AC6 的工程多多少少都会有几处代码调整这属于正常现象。等这轮调整做完后续编译基本就稳定了。6. Keil多版本共存与DLL位数的几个实操经验6.1 C51、MDK共存的时候启动哪个IDE装了 C51 又装 MDK桌面上可能有两个 UV4 快捷方式分别指向 C:\Keil\UV4\UV4.exe 和 C:\Keil_v5\UV4\UV4.exe但图标和程序名都叫 Keil uVision很容易点错。我的经验是打开 8051 工程用 C51 目录下的 UV4打开 Arm 工程用 MDK 目录下的 UV4。如果双击 .uvproj 工程文件打开的是另一个 IDE可以在工程文件的右键“打开方式”里指定对应路径的 UV4.exe。这个细节说大不大但白天写 8051 晚上写 Arm 的人非常容易踩。我就见过有人装了双版本以后一直双击快捷方式结果打开 C51 工程时提示找不到 A51 工具链误以为安装出了问题其实只是 IDE 启动错了目录。6.2 判断DLL是32位还是64位的三种方法当 IDE 报出“模块无法加载”或者“bad image”之类的错误时很多时候是 DLL 位数不匹配。最简单的判断方法是看 PE 头。随便找一款 Hex 编辑器打开 DLL找到文件偏移 0x3C 处的 4 个字节它指向 PE 头起始位置。在 PE 头起始位置之后 4 字节是“PE\0\0”签名紧接着的 2 字节就是 Machine 类型0x014C 代表 x86也就是 32 位0x8664 代表 x64也就是 64 位0xAA64 代表 ARM64。如果不想手动看 Hex用 PowerShell 脚本判断更省事我贴一个我常用的$path C:\path\to\your.dll $bytes [System.IO.File]::ReadAllBytes($path) $peOffset [BitConverter]::ToInt32($bytes, 0x3C) $machine [BitConverter]::ToUInt16($bytes, $peOffset 4) switch ($machine) { 0x014C { x86 (32-bit) } 0x8664 { x64 (64-bit) } 0xAA64 { ARM64 } default { Unknown } }另外装了 Visual Studio 的可以偷懒直接用 dumpbindumpbin /headers C:\path\to\your.dll在输出里搜索 machinex86 还是 x64 一目了然。这个方法最省事适合机器上正好有 VS 的情况不用再装额外工具。我最后再说一点个人体会编译器这种东西装的时候麻烦一次后面工程能稳定复现才是真正的省心。我把装好的 AC6.21 和 MDK 整体目录做了个压缩备份新电脑上直接解压、改一下环境变量就能恢复环境。上面这些坑大部分也是我一次一次补环境补出来的经验建议把它当做一个固定流程来走别每次都在同一个地方浪费时间。本文还有配套的精品资源点击获取
返回列表