简介:Arm Compiler 5.06 编译器是面向 ARM 架构嵌入式应用开发者的优化编译工具链,核心包含 armcc、armlink、armar 与 fromelf 等组件,可完成 C/C++ 源码编译、目标文件链接、静态库管理以及二进制反汇编与符号提取,支持 C99、C++11 标准和 -O1 至 -O4 多级优化,并具备循环展开、死代码消除、常量折叠等能力,便于在运行速度、代码密度与并行性之间取舍,为多种 ARM 处理器变种生成优化机器码。压缩包共 3 个文件,由 msi 安装包、exe 安装引导程序和 html 版本说明组成,整体约 80.03MB,适合在 Windows x86 环境部署,并配合 Keil MDK、Eclipse 等 IDE 或构建脚本使用。已有 22294 人学习下载,读者可据此搭建本地 ARM 交叉编译环境,查阅版本发布信息与兼容性说明,理解 armcc 优化选项、链接时死代码删除、重定位优化及静态库复用等关键环节,为嵌入式项目开发、编译参数调优和排错提供参考,适合需要系统掌握 ARM 编译流程与工具链配置的开发者。
1. 装错一次就够:Arm Compiler 5.06 编译器的版本坑
某开发者把 Arm Compiler 5.06 编译器解压到 D 盘,顺手把bin目录塞进 PATH,敲armcc --vsn也能回版本号,就以为装完了。结果一编译老工程,license 获取失败;再查,PATH 前面还躺着一个旧版armcc,实际调用的一直不是 5.06。这个场景在维护老 ARM 工程时很常见:版本固定、license 单独配、集成环境还要手动指路径,少一步就翻车。适合手里有 5.06 安装包、需要把编译环境固定下来的嵌入式开发者。下面按我装这套工具链的顺序走,先列环境,再解压、配 license、接 IDE,最后用最小工程验证。
2. 装前把环境列清:5.06 编译器需要的目录、运行库和 license
Arm Compiler 5.06 不是那种解压完就能到处跑的绿色工具。它带armcc、armlink、armasm、fromelf一整组可执行文件,还要依赖 C 库头文件、库文件、license 和系统运行库。装之前先把这几样列清楚,比装完再回头补要省很多时间。我见过最常见的失败不是安装包坏了,而是路径里带空格、license 指向目录、系统缺 32 位运行库,编译到一半才报错。
2.1 先确认拿到的是安装包还是解压版
拿到压缩包后先别急着双击。把包解开一层,看根目录里有没有setup.exe、install.sh这类安装入口。有安装器的,走安装器,装完记下实际安装路径;没有安装器的,按解压版处理,手动放到固定目录。两种方式的区别在于:安装器可能顺带写注册表、装运行库、放开始菜单项;解压版不会,PATH 和 license 都要自己配。
Linux 下可以先看文件类型:
# 先看压缩包内容和可执行文件类型 tar -tf armcompiler5.06.tar.gz | head -40 find . -maxdepth 3 -type f \( -name "armcc*" -o -name "armlink*" \) -print这段命令先列出压缩包前几十个条目,确认顶层目录名;再在当前目录三层内找armcc、armlink。如果找到的是bin/armcc,说明拿到的是已经展开的工具链目录,后面重点放在路径和 license 上。如果只看到安装脚本,不要手动复制bin,先按安装器走完。
Windows 下用 PowerShell 找:
# 递归找 armcc.exe,确认它在哪个层级 Get-ChildItem -Path D:\Packages\armcompiler5.06 -Recurse -Filter armcc.exe | Select-Object -ExpandProperty FullName输出里如果出现...\bin\armcc.exe,记下bin上一级作为工具链根目录。后面所有环境变量都指向这个根目录,不要直接指向bin。根目录和bin混用,是后面 PATH 配错的常见起点。
2.2 目录规划:路径不要带空格和中文
老工具链对路径里的空格、中文、括号都很敏感。不是说一定不能用,而是出问题时排查成本高:-I路径断掉、license 文件读不到、链接脚本路径被拆成两段,现象看起来像编译器坏了。我一般把工具链、license、工程输出分开放,路径全部用英文和短横线。
| 路径 | 用途 | 建议 |
|---|---|---|
D:\Tools\ARMCompiler5.06 | 工具链根目录 | 无空格、无中文 |
D:\Tools\ARMCompiler5.06\bin | armcc、armlink等 | 只进 PATH,不做根目录 |
D:\Licenses\armcompiler5.06.lic | license 文件 | 单独目录,不要放工程里 |
D:\Work\build | 编译输出 | 每次验证前清空 |
Linux 下同理,我一般放/opt/tools/armcompiler5.06,license 放/opt/licenses。不要把工具链放在桌面、下载目录或同步盘里。同步盘会在编译时锁文件,杀毒软件也可能把armcc.exe当可疑程序隔离,现象是昨天还能编,今天突然找不到可执行文件。固定目录、固定权限,后面换机器也按同一套路径复制。
2.3 运行库与系统位数对照
5.06 这一代工具链很多是 32 位程序,跑在 64 位系统上需要对应的 32 位运行库。Windows 上缺运行库时,双击armcc.exe可能一闪而过,或者在命令行报缺少某个 DLL;Linux 上用ldd能看到not found。先检查再装,别等编译报错才猜。
| 工具链位数 | 系统 | 常见依赖 | 检查方式 |
|---|---|---|---|
| 32 位 | 64 位 Windows | 32 位系统运行库 | 命令行运行armcc --vsn |
| 32 位 | 64 位 Linux | 32 位兼容库 | ldd bin/armcc看not found |
| 64 位 | 64 位系统 | 对应版本运行库 | file bin/armcc看 ELF 类型 |
Linux 下检查:
# 看可执行文件位数和动态库缺失 file "$ARMCC5_HOME/bin/armcc" ldd "$ARMCC5_HOME/bin/armcc" | grep "not found"file输出里带32-bit就说明是 32 位程序;ldd如果列出not found,先把对应兼容库补齐。Windows 下直接在 PowerShell 里跑armcc --vsn,缺 DLL 时系统会明确弹窗或报错。这里不要用“兼容模式”硬扛,运行库缺失和权限问题要分开处理。
license 也要提前放好。单机 license 一般是一个.lic文件,浮动 license 是端口@主机形式。第 4 章会细讲变量,这里先确认文件存在、可读,不要等armcc编译时才去找。环境清单对完,再进安装步骤,后面出错至少知道是路径、运行库还是 license 的问题。
3. 落地安装:把 Arm Compiler 5.06 解压到固定目录并接入 PATH
安装这一步的目标不是“能看到 armcc”,而是让命令行、脚本、集成环境都稳定调用同一个 5.06。做法很土:解压到固定目录,核对bin里的工具,设置ARMCC5_HOME,再把bin放进 PATH 前面。中间任何一步用了相对路径,后面换终端就容易翻车。
3.1 解压与目录结构核对
先建目录再解压,避免压缩包在目标目录里多套一层。Linux 下:
# 建固定目录,解压后核对 bin 目录 mkdir -p /opt/tools/armcompiler5.06 tar -xzf armcompiler5.06.tar.gz -C /opt/tools/armcompiler5.06 --strip-components=1 ls /opt/tools/armcompiler5.06/bin | grep -E 'armcc|armlink|armasm|fromelf'--strip-components=1用来去掉压缩包顶层目录,具体层数要看tar -tf的结果。如果压缩包本来就是bin/在顶层,就不要加这个参数,否则会把bin剥掉。解压后ls bin应该能看到armcc、armlink、armasm、fromelf这几个关键文件。少一个都别继续,先重新解压。
Windows 下用 PowerShell:
# 解压到固定目录,检查关键 exe Expand-Archive -Path D:\Packages\armcompiler5.06.zip -DestinationPath D:\Tools\ARMCompiler5.06 -Force Get-ChildItem D:\Tools\ARMCompiler5.06\bin -Filter "arm*.exe" | Select-Object Name-Force会覆盖同名文件,第一次安装可以用;如果目录里已经有旧版本,先备份再覆盖。检查结果里至少要有armcc.exe、armlink.exe、armasm.exe、fromelf.exe。如果解压后多了一层ARMCompiler5.06,把ARMCC5_HOME指到真正包含bin的那一层,不要凭感觉写路径。
3.2 设置 PATH 与版本切换
PATH 的顺序决定实际调用哪个armcc。我一般先设ARMCC5_HOME,再把$ARMCC5_HOME/bin放到 PATH 最前面。Linux 下临时生效:
# 当前终端生效,适合先验证 export ARMCC5_HOME=/opt/tools/armcompiler5.06 export PATH="$ARMCC5_HOME/bin:$PATH" which -a armccwhich -a会列出 PATH 里所有armcc,第一个才是实际调用的。如果第一个不是 5.06 目录,说明前面还有旧路径,要把旧路径从 PATH 里去掉,而不是在后面再追加一遍。永久生效可以写进 shell 配置文件,但改完要新开终端验证,旧终端不会自动刷新。
Windows PowerShell 临时设置:
# 当前窗口生效,先验证再写永久变量 $env:ARMCC5_HOME = "D:\Tools\ARMCompiler5.06" $env:Path = "$env:ARMCC5_HOME\bin;" + $env:Path Get-Command armcc | Format-List SourceGet-Command armcc的Source就是实际调用的完整路径。永久写入用户变量可以用:
# 写入用户环境变量,新开终端生效 [Environment]::SetEnvironmentVariable("ARMCC5_HOME","D:\Tools\ARMCompiler5.06","User") $old = [Environment]::GetEnvironmentVariable("Path","User") [Environment]::SetEnvironmentVariable("Path","%ARMCC5_HOME%\bin;$old","User")这里把%ARMCC5_HOME%\bin放在用户 PATH 前面,避免系统 PATH 里的旧版抢先。改完关掉 IDE 和终端,重新打开再查。集成环境启动时继承的是启动那一刻的环境变量,不重启它,PATH 改了也看不到。
3.3 第一次运行 armcc 的检查点
先跑版本,不要一上来就编工程:
# 三个核心工具都查一遍,版本要一致 armcc --vsn armlink --vsn fromelf --vsn输出里应该能看到 5.06 字样。三个工具版本要一致,如果armcc是 5.06、armlink却是别的版本,后面链接会出奇怪问题。再查路径:
# Linux 看所有命中项,Windows 用 where armcc which -a armcc where armcc第一个命中项必须是ARMCC5_HOME/bin下的文件。如果armcc --vsn能跑但编译报 license,说明安装和 PATH 基本对了,问题在 license 配置;如果armcc --vsn都报缺少 DLL 或not found,回到 2.3 补运行库。这个顺序不要乱,先版本、再路径、最后 license,排查时能少绕很多路。
4. 配置编译器:license、集成环境路径和编译参数
5.06 装好后,真正影响能不能干活的是三件事:license 能不能拿到、集成环境有没有指到 5.06、编译参数有没有沿用老工程的约定。license 配错的表现很像编译器坏了,集成环境路径配错则会偷偷调用旧版。参数不要一上来就加一堆优化,先把工程编过,再谈优化和 C99。
4.1 license 变量怎么配才不飘
单机 license 用ARMLMD_LICENSE_FILE指向文件本身,不是指目录。Linux 下:
# 指向 .lic 文件,不要指向所在目录 export ARMLMD_LICENSE_FILE=/opt/licenses/armcompiler5.06.lic export LM_LICENSE_FILE="$ARMLMD_LICENSE_FILE" test -f "$ARMLMD_LICENSE_FILE" && echo "license file ok"test -f只确认文件存在,不确认内容有效。变量值不要带引号,不要写成/opt/licenses/。如果 license 是浮动形式,值写成端口@主机,例如8224@license-host,这里的主机名按实际 license 服务填写。LM_LICENSE_FILE是兼容变量,有些老脚本认它,两个都设上更稳。
Windows 下用setx写用户变量:
# 写用户变量,新开终端生效 setx ARMLMD_LICENSE_FILE "D:\Licenses\armcompiler5.06.lic" setx LM_LICENSE_FILE "D:\Licenses\armcompiler5.06.lic"setx不会影响当前已经打开的终端,也不影响已经启动的 IDE。改完关掉 IDE,新开终端再编译。如果编译仍然报 license,先echo %ARMLMD_LICENSE_FILE%看值有没有被别的脚本覆盖,再看 license 文件是否过期、是否绑定了主机信息。不要同时设多个 license 路径还带分号,老工具链解析多路径时容易只取到第一段。
4.2 在集成环境里指定 5.06 的 armcc
集成环境里要填的不是一个bin目录,而是具体工具路径。不同界面的叫法不一样,但核心就四个:C 编译器、链接器、汇编器、格式转换。按下面这张表填,填完清一次构建。
| 工具 | 填什么 | 注意 |
|---|---|---|
| C 编译器 | <ARMCC5_HOME>/bin/armcc | 不要只填bin目录 |
| 链接器 | <ARMCC5_HOME>/bin/armlink | 必须和armcc同版本 |
| 汇编器 | <ARMCC5_HOME>/bin/armasm | 老启动文件会用到 |
| 格式转换 | <ARMCC5_HOME>/bin/fromelf | 生成 bin/hex 时用 |
如果界面里有“使用默认编译器”之类的选项,先取消,再手动指定路径。改完不要直接增量编译,先清掉build、Objects、Listings这些输出目录,让构建日志重新打印编译器路径。日志第一行通常会带实际调用的armcc路径,看一眼是不是 5.06 目录下的,比猜可靠。
4.3 常用编译参数与 C99 取舍
验证阶段先用最小参数编一个文件,不要直接把老工程的全量参数搬过来:
# 最小编译验证:只编译不链接 armcc --cpu Cortex-M3 --c99 -O1 -g -I./inc -DDEBUG=1 -c src/main.c -o build/main.o--cpu要和芯片内核一致,Cortex-M3 只是示例,实际按工程选;--c99打开 C99 支持,但老工程如果大量用编译器扩展语法,先去掉它试一次;-O1比-O0生成代码小一些,又比-O2好调试;-g保留调试信息;-I指定头文件目录;-D传宏定义;-c只编译不链接;-o指定输出文件。参数顺序没有强制要求,但路径里不要用反斜杠,Linux 和 Windows 混用工程时容易断。
如果老工程原来用的是 C89 风格,先不要加--c99,把编译器路径换过来编过再说。C99 打开后出现一批语法错误,先看是不是工程本来就不支持,而不是 5.06 坏了。优化等级也一样,先-O0或-O1编过,再逐步往上加。装环境阶段的目标是“能稳定复现构建”,不是一次把性能调到位。
5. 避坑排查:5.06 编译器最常翻车的五处
这套工具链的报错经常不直接指向根因:license 报错可能是环境变量没生效,版本不对可能是 PATH 顺序,链接报错可能是armcc和armlink混用。下面五条是我实际踩过的,按“现象、原因、解决”记,遇到类似现象先对照,不要急着重装。
5.1 现象:armcc 能跑,一编译就报 license
现象是armcc --vsn正常,编译任意文件就提示 license 获取失败。原因通常有三个:ARMLMD_LICENSE_FILE指向了目录而不是文件;变量写在旧终端里,新终端没生效;IDE 启动早于变量设置,继承的是旧环境。解决顺序是先在新终端打印变量,再确认文件路径,最后重启 IDE。
# 先确认变量和文件,再触发一次编译 echo "$ARMLMD_LICENSE_FILE" test -f "$ARMLMD_LICENSE_FILE" && echo ok armcc --cpu Cortex-M3 -c hello.c -o hello.o如果echo为空,说明变量没进当前 shell;如果文件不存在,路径写错了;如果都正常还报 license,看 license 是否过期或绑定了别的主机。Windows 下用echo %ARMLMD_LICENSE_FILE%,并且注意setx后必须新开终端。
5.2 现象:PATH 改了但 IDE 仍用旧版
现象是命令行armcc --vsn已经是 5.06,IDE 构建日志里还是旧路径。原因是 IDE 启动时继承环境变量,改 PATH 后没有完全退出重启;或者 IDE 工具链设置里还勾着“默认编译器”。解决方法是先完全关闭 IDE,包括托盘进程,再打开;然后在工具链设置里手动指定armcc、armlink的完整路径,清构建目录重编。
# 看当前实际命中路径,确认不是旧版 Get-Command armcc | Format-List Source where.exe armccwhere.exe会列出所有命中项,第一个才是实际调用。如果第一个仍是旧路径,把旧路径从用户 PATH 里删掉,不要只在后面追加 5.06。
5.3 现象:链接时库版本不匹配
现象是编译单个文件没问题,链接时提示库文件格式不对、符号找不到,或者 map 文件里工具版本不一致。原因多半是armcc用了 5.06,armlink却命中了别的版本;或者工程里混入了别的工具链编出来的.o、.lib。解决方法是先查三个工具版本,再清掉全部中间文件重编。
# 三个工具版本必须一致 armcc --vsn armlink --vsn fromelf --vsn清构建目录时不要只删.axf,.o、.d、.crf这些中间文件也要清。老工程换编译器后,最稳的做法是全新构建一次,不要增量。
5.4 现象:路径含空格导致 include 失败
现象是头文件明明存在,编译却报找不到,或者-I后面的路径被截断。原因是工程路径、工具链路径或 license 路径里带空格、中文、括号,老工具链解析参数时按空格拆开。解决方法是把工具链和工程都移到无空格路径,-I用相对路径或短路径,不要在参数里手写带空格的绝对路径。
# 检查路径里有没有空格和中文 printf '%s\n' "$ARMCC5_HOME" | grep -nE ' |[^\x00-\x7F]' && echo "路径需要调整"这条命令只是快速提示,真正处理还是把目录迁到/opt/tools/...或D:\Tools\...这类路径下。不要用引号硬包,老工具链对引号的处理不统一。
5.5 现象:32 位工具链缺运行库
现象是命令行运行armcc直接报缺少 DLL,Linux 下报No such file or directory,但文件明明存在。原因是 64 位系统缺 32 位运行库,或者文件没有执行权限。解决方法是先看文件位数,再补对应运行库;Linux 下还要确认chmod +x。
# 看位数、权限和动态库缺失 file "$ARMCC5_HOME/bin/armcc" ls -l "$ARMCC5_HOME/bin/armcc" ldd "$ARMCC5_HOME/bin/armcc" | grep "not found"file显示 32 位就补 32 位兼容库;ls -l没有x就加执行权限;ldd有not found就按缺失库名补。不要用 64 位运行库去套 32 位程序,版本对不上还是会报错。
6. 装完怎么验证跑通:从 armcc --vsn 到 map 文件
验证不要只看armcc --vsn。版本对只能说明可执行文件能跑,license、头文件、链接器、集成环境路径都可能没通。我一般分三层:先看工具版本和实际路径,再编译一个最小 C 文件,最后看集成环境构建日志和 map 文件里的工具版本。三层都过,才算这套 5.06 环境能交付。
| 检查项 | 命令或位置 | 通过标准 |
|---|---|---|
| 编译器版本 | armcc --vsn | 输出带 5.06 |
| 实际路径 | which -a armcc/where.exe armcc | 第一项是目标bin |
| 链接器版本 | armlink --vsn | 与armcc同版本 |
| 最小编译 | armcc --cpu Cortex-M3 -c hello.c -o hello.o | 生成.o,无 license 错 |
| 产物检查 | fromelf --text -c hello.o | 能看到代码段信息 |
| IDE 构建 | 清 build 后重编 | 日志路径指向 5.06 |
| map 文件 | 链接后看头部 | 工具版本为 5.06 |
最小 C 文件不用复杂,一个int main(void){return 0;}就够。编译命令按第 4 章给,先不加一堆优化参数。生成.o后跑fromelf --text -c hello.o,能读出段信息说明格式转换工具也通了。如果工程有完整启动文件和链接脚本,再走一次链接,打开 map 文件看头部工具版本;没有完整工程就停在对象文件验证,不要硬链接。
# 最小验证:编译、看产物、再查一次路径 printf 'int main(void){return 0;}\n' > hello.c armcc --cpu Cortex-M3 -c hello.c -o hello.o fromelf --text -c hello.o | head -20 which -a armcc这段命令里printf只是生成测试文件,--cpu按实际内核改,fromelf的--text -c用来输出文本形式的段信息。最后再查一次which -a,是因为有些脚本会在编译过程中改 PATH,查一次能确认没有中途被换掉。Windows 下把which -a换成where.exe armcc,其余命令同理。
从那以后我每次装完 5.06,都强制走一遍“版本、路径、最小编译、IDE 日志”四步,不跳步。看着麻烦,但比在工程里查半天 license 和旧版本混用要省时间。希望帮到你。
本文还有配套的精品资源,点击获取