☰
ARMCC 5.06 b960安装配置与Keil找不到编译器排查
2026/11/6 4:39:05 网站建设 项目流程

简介:面向ARM嵌入式开发者的ARM Compiler 5.06(960)编译器安装包,适合使用Keil MDK进行单片机与32位ARM项目开发的人员。它提供符合ANSI C标准的armcc编译器,支持代码大小与运行速度优化、Thumb/Thumb-2等指令子集,并可与Keil调试工具链配合,用于驱动、固件及裸机工程的编译构建与问题定位。压缩包为rar格式,共3个文件,包含msi安装包、exe安装引导程序及html版本说明,整体约80.52MB,便于在Windows x86平台完成工具链部署并核对版本更新与已知问题。已有3609人学习,说明该版本在嵌入式开发社区具有一定参考价值。读者可借此搭建较完整的ARMCC 5.06编译环境,结合版本说明了解960版次的优化与修复,并在Keil工程中验证编译、优化选项和调试流程,为存量ARM项目维护与迁移提供实用支撑,对编译选项配置、指令集选择与调试联调等环节也有参考意义。

1. 一个下午装了两遍的 ARMCC:工程卡在“找不到编译器”这一步

上周帮人看一个 Cortex-M3 的老工程,Keil 打开能看代码,一点 Build 就弹*** Target uses ARM-Compiler 'Default Compiler Version 5' which is not available。这不是代码问题,是新版 MDK 已经把 ARMCC 5 从安装包里摘出去了,而这份ARMCompiler_506_Windows_x86_b960.msi就是补那块缺口的东西——ARMCC 5.06 update 6(build 960),ARM Compiler 5 这条线的最后一个版本。做 arm 嵌入式硬件的,只要手里还有标准库工程、老启动文件、第三方.lib,迟早会碰上它。装不上或者装上了 Keil 不认,工程就停在那一步,连报错都看不出是环境问题还是代码问题,我那次就是装了两遍才把路径和环境变量捋顺。

2. 版本和环境先对齐:ARMCC 5.06 b960 在工具链里占哪一格

这套编译器不是“装上就完事”的独立软件,它必须被 Keil MDK 或你自己的 Makefile 找到,才算真正可用。所以装之前得先把三件事想清楚:它由哪几个可执行文件组成、装到哪个目录、跟机器上已有的 ARM Compiler 6 怎么共存。跳过这一步直接双击 MSI,八成会得到一份“装好了但用不上”的目录。

2.1 armcc、armasm、armlink、fromelf 各管一段,缺一个就断链

ARMCC这个名字容易被当成单个程序,实际它是一组:armcc.exe编 C/C++,armasm.exe汇编.s启动文件,armlink.exe链接出.axf,fromelf.exe把.axf转成.bin/.hex或反汇编,armar.exe打包静态库。这五个都在安装目录的bin下,任何一个被杀软隔离或者被覆盖成别的版本,症状都不一样:缺armcc是编译第一步就失败,缺armlink是目标文件都生成了才报错,缺fromelf则是编译链接全绿、最后生成 bin 的时候断掉。

还有一个常被忽略的点:ARMCC 5 和 ARM Compiler 6(armclang)是两套完全不同的命令行语义。AC6 用--target=arm-arm-none-eabi -mcpu=cortex-m4,AC5 用--cpu Cortex-M4;AC6 默认 C99 起步,AC5 要显式--c99。你现在能在网上抄到的很多编译参数是 AC6 的,往 5.06 上一贴就报 “unknown option”。所以判断工程该用哪套,看的不是新旧,而是startup_*.s和散列加载文件(scatter)是按哪套写的。

组件作用缺失时的典型现象
armcc.exe编译 C/C++ 到 .o第一条编译命令即失败,提示找不到 armcc
armasm.exe汇编 .s 启动文件提示无法打开 startup_xxx.o 或汇编语法错误
armlink.exe链接生成 .axf所有 .o 生成完毕,链接阶段报 cannot find armlink
fromelf.exe生成 bin/hex、反汇编编译链接全过,最后一步产物缺失
armar.exe生成 .lib 静态库引用第三方库的工程报找不到 .lib

2.2 为什么我从不把它装进 Program Files (x86)

这个 MSI 是 x86 包,在 64 位 Windows 上默认落点是C:\Program Files (x86)\...。看起来规矩,实际会踩两个坑:一是路径里有空格和括号,有些老旧 Makefile 和批处理在拼-I参数时不做引号处理,直接报 “cannot open source input file”;二是 Keil 对 AC5 的默认查找位置就是 MDK 安装目录下的ARM\ARMCC,你装在别处就得手动指路。

我一般统一装到C:\Keil_v5\ARM\ARMCC,MDK 装在默认的C:\Keil_v5时它能直接被认出来,路径无空格、无括号、无中文,命令行和 Keil 两边都省事。如果 MDK 装在别的盘,就把整个ARMCC目录跟着搬过去,别只搬bin——include、lib、sw\mappings这些同级目录都得在,armcc是靠自己相对路径去找标准头文件和库的。

环境对照这一块,我按实际装过的机器整理成下面这样,装之前扫一眼能省掉很多试错:

项目建议值说明
操作系统Windows 7 SP1 / 10 / 11,32 或 64 位64 位系统上装的是 32 位程序,属正常
安装目录C:\Keil_v5\ARM\ARMCC无空格无中文,且是 MDK 默认查找位
磁盘占用数百 MB 量级含 include、lib、bin、示例
前置依赖无额外运行库缺 dll 多半是被杀软删了文件
共存情况可与 AC6 并存靠工程里的 Compiler 下拉切换,互不覆盖
权限管理员写 Program Files 和注册表都需要

2.3 装前三项确认:旧残留、MDK 版本、杀软

第一项,看机器上是不是已经有半套 ARMCC。判断方法很简单:进C:\Keil_v5\ARM\看有没有ARMCC目录,有的话看bin\armcc.exe的文件版本是不是 5.06 build 960。如果之前装过 5.03 或 5.04,两个版本混在一个目录里,头文件和库会串,报出来的错完全没逻辑。这种时候我更倾向于把旧目录整个改名备份,装完新的没问题再删,这就是我说的后悔药。

第二项,确认 MDK 版本。MDK 5.37 之后安装包不再自带 AC5,需要单独装;5.36 及以前自带,但版本可能是 5.06 update 5 之类,跟你手上这个 b960 不一定一致。版本不一致时,最稳的做法是统一——工程用哪个 build,工具链就用哪个,因为 AC5 小版本之间对--cpu Cortex-M7的支持、对 C99 某些特性的处理是有差异的。

第三项,临时关掉杀软的实时防护再装。MSI 安装过程中会释放大量小文件,armcc.exe、armar.exe这类可执行文件被当成可疑程序拦掉的情况我见过不止一次,表现是装完目录里少几个 exe,然后编译时报莫名其妙的错。

提示:装之前把C:\Keil_v5\ARM\ARMCC这个路径记下来,后面配环境变量、在 Keil 里指路、写 Makefile 都要一字不差地用它,路径中间换个写法就可能找不到。

3. 安装 ARMCC 5.06 b960:图形、静默和只解包三种装法

MSI 的好处是它把安装、卸载、修复都标准化了,坏处是默认行为不一定合你的意。我平时看场景选装法:自己机器上装一次,走图形界面,顺便把路径改掉;给同事批量配或者写部署脚本,走静默;只想从包里掏几个文件出来对比版本,那就只解包不安装。

3.1 图形安装:只改一个地方,其余默认

双击ARMCompiler_506_Windows_x86_b960.msi,一路 Next,到选择安装位置的界面停下来,把路径改成C:\Keil_v5\ARM\ARMCC。其余选项(开始菜单、快捷方式)保持默认就行,这套编译器没有需要勾选的可选组件,装的是完整工具链。

装完的目录结构应该是这样,缺哪一层后面都会出问题:

C:\Keil_v5\ARM\ARMCC\ ├── bin\ # armcc.exe armasm.exe armlink.exe fromelf.exe armar.exe ├── include\ # 标准 C 库头文件、CMSIS 相关头 ├── lib\ # 各 cpu 变体的运行时库 ├── sw\mappings\ # 编译器的产品描述文件,环境变量要用 └── examples\ # 少量示例,不影响使用

bin是入口,include和lib是armcc自己按相对路径往上找的,所以bin不能单独挪走。sw\mappings那个目录容易被忽略,但如果要配ARM_PRODUCT_PATH,指的就是它的上一级或本身,具体看版本里 mappings 的组织方式。

3.2 静默安装:msiexec 参数怎么给

批量部署时用msiexec,核心就三个开关:/i装、/x卸、/qn不出界面。日志一定要开,MSI 失败时的提示极其笼统,真正的错误码在日志里。

:: 静默安装,日志写到临时目录,参数名以实际日志为准 msiexec /i "ARMCompiler_506_Windows_x86_b960.msi" /qn /norestart /l*v "%TEMP%\armcc506_install.log" :: 想指定目录时追加属性,属性名可能是 INSTALLDIR 或 APPDIR msiexec /i "ARMCompiler_506_Windows_x86_b960.msi" /qn INSTALLDIR="C:\Keil_v5\ARM\ARMCC" /l*v "%TEMP%\armcc506_install.log" :: 卸载 msiexec /x "ARMCompiler_506_Windows_x86_b960.msi" /qn /norestart

参数说明:/qn完全静默,/qb是带进度条的静默(排查时更爱用这个,能看出卡在哪一步),/norestart禁止安装程序自己重启机器,/l*v打开最详细的日志。INSTALLDIR这个属性名不是所有 MSI 都一样,有的包用APPDIR或TARGETDIR,不确定的时候先跑一次带/qb的,再去日志里搜INSTALLDIR或Directory table,能直接看到它认哪个名字。写部署脚本我不猜属性名,一律从日志里取。

3.3 只解包不安装:/a 的用法

有时候只是想在 CI 机器上放一份工具链,或者想拿 b960 的lib去对比另一台机器上的版本,不需要走注册表那一套。这时用管理安装解包:

:: 管理安装:只把文件展开到目标目录,不注册、不写系统信息 msiexec /a "ARMCompiler_506_Windows_x86_b960.msi" /qb TARGETDIR="D:\toolchains\armcc506"

解出来的目录里通常会多一层Program Files之类的结构,实际的可执行文件还在下面的ARMCC\bin,用之前把这一层剥掉,让bin直接位于D:\toolchains\armcc506\bin就行。这种方式装出来的工具链在命令行里跑没问题,但 Keil 不一定认——Keil 判断一个目录能不能当编译器用,还会看它旁边的配置信息。所以解包只适合命令行和 CI,本地开发还是老老实实走安装。

装完之后不要急着打开 Keil 编译工程,先做一件小事:在文件资源管理器里进bin目录,看五个 exe 是不是都在,右键armcc.exe看属性里的版本信息,Product version 应该能看到 5.06 update 6 (build 960) 的字样。这一步花十秒,能挡掉后面半小时的困惑。

4. 配置环境变量和 Keil 指向:让两边都找到这套 5.06

装完但用不了,九成出在这一步。要么命令行里armcc不是这个版本,要么 Keil 的 Compiler 下拉里根本没有 “version 5” 这一项。这两条路要分别打通,而且它们互不影响——命令行能编译不代表 Keil 能认,反之亦然。

4.1 PATH 加上 bin,再补两个自己用的辅助变量

先把bin加进系统 PATH,这是命令行能直接敲armcc的前提。图形界面在“系统属性 → 环境变量”里改,命令行等价写法如下(需要管理员权限的 cmd):

:: 把 ARMCC 的 bin 追加到系统 PATH;用 setx 会写进注册表,对之后新开的窗口生效 setx PATH "%PATH%;C:\Keil_v5\ARM\ARMCC\bin" /M :: 我习惯再加两个变量,纯为 Makefile 里少写绝对路径,不是官方必需 setx ARMCC5_HOME "C:\Keil_v5\ARM\ARMCC" /M setx ARMCC5_INC "C:\Keil_v5\ARM\ARMCC\include" /M

setx写完不会影响当前已经打开的窗口,验证必须新开一个 cmd。/M表示写系统变量而不是用户变量,不写/M就只有当前用户能用,给多账号机器配环境时这个区别很要命。ARMCC5_HOME和ARMCC5_INC这两个是我自己加的约定,官方文档里没有硬性要求,好处是 Makefile 里写-I$(ARMCC5_INC)比写一大串盘符路径干净,换机器只改这两个变量。

注意 PATH 的长度。老机器上 PATH 本来就长,setx有 1024 字符的截断风险,一旦截断,之前的路径全丢,这就是典型的“配个编译器把系统搞坏”事故。保守做法是先在“环境变量”窗口里看一眼 PATH 的现有长度,超过七八百字符就别用setx整串覆盖,手工在图形界面里追加一行。

4.2 Keil 里把编译器切到 5.06(b960)

打开 MDK,进Project → Manage → Project Items,切到Folders/Extensions页,这里能看到 ARM Compiler 的配置区。如果 AC5 已经装在C:\Keil_v5\ARM\ARMCC,一般能直接选到;如果选不到,就手动指到bin目录里的armcc.exe。

指好之后回到工程,Options for Target → Target页,ARM Compiler 下拉里选Use default compiler version 5。这时再编译,日志开头会出现类似Toolchain: ARM Compiler 5.06 update 6 (build 960)的一行,看到这行才算真的切过去了。只看到 “ARM Compiler 5” 而没有 build 号,说明指的可能是另一个版本。

工程层面还有两处要跟着改,否则切完编译器照样报错。一是C/C++页的Misc Controls,从 AC6 工程拷过来的--target=... -mcpu=...必须换成 AC5 的--cpu Cortex-M4,否则第一条命令就报未知选项。二是Define里的宏,AC5 下常用USE_STDPERIPH_DRIVER、STM32F10X_MD这类;如果工程原来是 AC6 加 HAL 库,宏名和包含路径都得核对一遍,别指望切换编译器后自动兼容。

4.3 Makefile 和批处理里怎么调

命令行工程要注意路径分隔符和引号。armcc在 Windows 上接受正斜杠,Makefile 里写C:/Keil_v5/...比反斜杠安全,反斜杠会被 Make 当转义符吃掉。

# 一个最小可用的编译规则片段 ARMCC = C:/Keil_v5/ARM/ARMCC/bin/armcc.exe ARMLINK= C:/Keil_v5/ARM/ARMCC/bin/armlink.exe FROMELF= C:/Keil_v5/ARM/ARMCC/bin/fromelf.exe INC = -I./inc -I$(ARMCC5_INC) CFLAGS = --cpu Cortex-M4 --c99 -c -O2 -g --split_sections $(INC) -DUSE_STDPERIPH_DRIVER startup.o: startup_stm32f10x_md.s $(ARMCC) --cpu Cortex-M4 -c $< -o $@ %.o: %.c $(ARMCC) $(CFLAGS) $< -o $@ app.axf: $(OBJS) $(ARMLINK) --cpu Cortex-M4 --scatter app.sct -o $@ $(OBJS) --info totals --map --list=app.map app.bin: app.axf $(FROMELF) --bin --output $@ $<

几个参数值得单独说:--c99在 AC5 里必须显式给,不给就按 C90 处理,//注释和变量声明位置都会报错;--split_sections让每个函数单独成段,配合--remove能砍掉未引用的代码,对小容量 Flash 的片子很关键;-g生成调试信息,出.axf就靠它;--scatter指定分散加载文件,没有特殊内存布局可以省掉,让链接器按默认规则排。--info totals会在链接结束打印 Code/RO/RW/ZI 四个尺寸,这个输出后面验证环节要用来对照。

4.4 License:不报错就不用管,报错只看一个变量

用 Keil MDK 的话,License 由 MDK 自己的授权机制管,装完 AC5 直接就能编,不用额外操作。只有在单独使用这套编译器(不经 Keil、纯命令行调armcc)时,才会碰到 FlexLM 那一套。

判断方法很直接:命令行敲一条armcc --vsn,如果能打印版本信息就说明不缺 License;如果报C9555E: Failed to check out a license,那就是授权没找着。常见做法是指一个环境变量过去:

:: 指向 license 文件,或指向授权服务器(端口@主机) setx ARMLMD_LICENSE_FILE "C:\Keil_v5\ARM\licenses\license.dat" /M

这个变量名是 ARM 系工具链沿用的约定,LM_LICENSE_FILE有些老脚本也在读。改完新开窗口再试armcc --vsn。如果还报错,先看变量值里有没有多余空格和引号,再看 license 文件是不是被换行或编码破坏——这两点比“授权过期”更常见。

5. 排查清单:ARMCC 5.06 装完最常翻车的五个点

这五条是我在不同机器上真实撞过的,顺序按出现频率排。遇到问题别急着重装,先按“现象”对一下,多数时候改一个路径或一个变量就好。

一、MSI 装到一半回滚,报 1603 或 1722

现象:进度条走到一半突然回滚,弹窗只有一句笼统的安装失败,事件查看器里能看到 1603。原因通常是三选一:目标路径含空格括号或中文、当前账户没有管理员权限写目录、杀软正在扫安装释放出来的 exe 导致文件被锁。解决:先换到C:\Keil_v5\ARM\ARMCC这种干净路径重试;用管理员身份运行 cmd 再执行msiexec;装之前把实时防护临时关掉。还失败就看%TEMP%下那份/l*v日志,搜Return value 3,它前面几行就是真正的原因。

二、装完 Keil 里 Compiler 下拉没有 version 5

现象:Options for Target里只有 version 6 或者干脆是灰的,编译报Default Compiler Version 5 which is not available。原因是 MDK 5.37 及以后不再随包附带 AC5,Keil 不会自动去全盘搜。解决:进Project → Manage → Project Items → Folders/Extensions,把 ARM Compiler 指向C:\Keil_v5\ARM\ARMCC\bin;或者干脆把整个 ARMCC 目录放到 MDK 安装目录的ARM\下面,让它按默认位置找到。

三、命令行能编,Keil 编报 cannot open source input file

现象:同一个文件,cmd 里armcc -I./inc -c main.c过了,Keil 里报找不到某个头文件(常见的是core_cm3.h、stm32f10x.h)。原因是 Keil 工程里的包含路径是相对路径或旧目录结构,换了编译器和库版本后相对关系变了。解决:在C/C++ → Include Paths里把 CMSIS 和标准库的绝对路径补全,别依赖.\..\Libraries\CMSIS\CM3\CoreSupport这种跨层相对写法;改完 Clean 一次再全编,缓存的目标文件会掩盖问题。

四、C9555E: Failed to check out a license

现象:armcc一执行就退出,提示签出授权失败,编译一个文件都过不去。原因:单独使用工具链时没有配置授权,或ARMLMD_LICENSE_FILE写错。解决:先确认是不是用 Keil 编译——用 Keil 的话不涉及这个报错;纯命令行就按 4.4 配变量,注意值里不要带引号和尾随空格。判断变量有没有生效,在 cmd 里echo %ARMLMD_LICENSE_FILE%看一眼就知道。

五、链接过了但行为不对,或者中文注释报错

现象有两种。一种是编译链接都绿,烧进去跑飞,链接日志里能看到__use_two_region_memory或SystemInit相关的 warning;另一种是源文件里有中文注释,armcc报#8: missing closing quote之类。前者是启动文件和 microlib 不匹配——用了 microlib 却链接了标准库的启动文件,或者 scatter 文件里的堆栈段名字对不上,解决是把Use MicroLIB的勾选状态和启动文件、scatter 三者统一。后者是编码问题:AC5 对 UTF-8 BOM 和 GBK 混用的文件很敏感,把源文件统一转成 GBK(或统一去掉 BOM 的 UTF-8)再编,别在一个工程里混着两种编码。

注意:五条里有四条落在“路径”和“版本一致性”上,跟编译器本身的 bug 关系不大。真怀疑装坏了,最快的验证不是重装,而是按下一章的三步跑一遍最小例子,能跑通就说明工具链是好的,问题在工程配置。

6. 装完怎么验证:三条命令加一个最小工程,十分钟定生死

我不喜欢“装完打开 Keil 编一下大工程看行不行”这种验证方式,变量太多——工程配置、库版本、链接脚本全混在一起,错了也定位不到。我的做法是先做三层验证,从工具本身到最小可执行产物,逐层排除。

第一层,版本自证。新开一个 cmd,跑这三条:

armcc --vsn armasm --vsn fromelf --vsn

armcc --vsn的输出里应该出现Product: ARM Compiler 5.06 update 6 (build 960)和Toolchain: ARM Compiler 5.06。如果打印的是 5.03 或 5.06 update 5,说明 PATH 里排在前面的还有另一份,用where armcc看它在找哪个路径,把旧的从 PATH 里挪走。armasm和fromelf也各跑一次,确认五个组件是同一套,别出现 bin 目录里混了版本的情况。

第二层,最小编译链。写一个不依赖任何库的 C 文件,只放一个函数和一个数组,然后走完整流程:

:: 编译 -> 链接 -> 转 bin,全程不引用任何外部头文件和库 armcc --cpu Cortex-M4 --c99 -c -O1 -o mini.o mini.c armlink --cpu Cortex-M4 -o mini.axf mini.o --info totals --map --list=mini.map fromelf --bin --output mini.bin mini.axf :: 看 bin 前 8 个字节,向量表初值和复位地址 fromelf -c mini.axf | more

链接那步的--info totals会打印Code (inc. data) RO Data RW Data ZI Data Debug一行,有这行说明链接器正常收尾。fromelf --bin生成的mini.bin大小应该是个非零的小数值,如果生成的是 0 字节或者报错,问题在 fromelf 和 axf 的匹配上,跟上一步的编译无关。第三层才是把这个最小工程搬进 Keil,新建一个空工程,选好器件和Use default compiler version 5,把启动文件加进去编译,看 Build Output 里是否出现Program Size: Code=... RO-data=... RW-data=... ZI-data=...。三层的预期结果对照如下:

验证层命令或操作通过标准不通过时先看哪
工具版本armcc --vsn显示 5.06 update 6 (build 960)where armcc,PATH 顺序
编译armcc -c mini.c生成 mini.o,无报错参数是否用了 AC6 语法
链接armlink -o mini.axf打印 Code/RO/RW/ZI 四组尺寸是否有未解析符号
转格式fromelf --bin生成非零大小的 mini.binaxf 是否完整、路径是否可写
Keil 集成空工程 + 启动文件编译出现 Program Size 一行Compiler 下拉是否真为 version 5

还有一个我每次都做的小动作:把mini.bin的前 8 个字节拉出来看。前 4 字节是小端的初始栈指针,正常应该落在0x2000xxxx这个区间;紧接着 4 字节是复位向量,末位应该是奇数(Thumb 状态),比如0x080001C9。如果前 8 字节全是FF或者全00,说明启动文件和链接脚本没对上,这时候就算 Keil 显示编译成功,烧进去也是跑飞的。这一步不花时间,但能挡掉最隐蔽的一类“编译通过、运行异常”。

从那以后我每次装完 ARMCC,不管这机器多干净、不管安装包是从哪台机器拷来的,都强制走一遍这三层验证再打开真实工程,多花十分钟,省下的是在两万行代码里找环境问题的那个下午。这套流程配合手上这份ARMCompiler_506_Windows_x86_b960.msi,从装到跑通基本可以一次成型。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询