Arm Compiler 5.06 安装配置与避坑实战
简介Arm Compiler 5.06 编译器是面向 ARM 架构嵌入式应用开发者的优化编译工具链核心包含 armcc、armlink、armar 与 fromelf 等组件可完成 C/C 源码编译、目标文件链接、静态库管理以及二进制反汇编与符号提取支持 C99、C11 标准和 -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 编译器需要的目录、运行库和 licenseArm 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\binarmcc、armlink等只进 PATH不做根目录D:\Licenses\armcompiler5.06.liclicense 文件单独目录不要放工程里D:\Work\build编译输出每次验证前清空Linux 下同理我一般放/opt/tools/armcompiler5.06license 放/opt/licenses。不要把工具链放在桌面、下载目录或同步盘里。同步盘会在编译时锁文件杀毒软件也可能把armcc.exe当可疑程序隔离现象是昨天还能编今天突然找不到可执行文件。固定目录、固定权限后面换机器也按同一套路径复制。2.3 运行库与系统位数对照5.06 这一代工具链很多是 32 位程序跑在 64 位系统上需要对应的 32 位运行库。Windows 上缺运行库时双击armcc.exe可能一闪而过或者在命令行报缺少某个 DLLLinux 上用ldd能看到not found。先检查再装别等编译报错才猜。工具链位数系统常见依赖检查方式32 位64 位 Windows32 位系统运行库命令行运行armcc --vsn32 位64 位 Linux32 位兼容库ldd bin/armcc看not found64 位64 位系统对应版本运行库file bin/armcc看 ELF 类型Linux 下检查# 看可执行文件位数和动态库缺失 file $ARMCC5_HOME/bin/armcc ldd $ARMCC5_HOME/bin/armcc | grep not foundfile输出里带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-components1 ls /opt/tools/armcompiler5.06/bin | grep -E armcc|armlink|armasm|fromelf--strip-components1用来去掉压缩包顶层目录具体层数要看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 oktest -f只确认文件存在不确认内容有效。变量值不要带引号不要写成/opt/licenses/。如果 license 是浮动形式值写成端口主机例如8224license-host这里的主机名按实际 license 服务填写。LM_LICENSE_FILE是兼容变量有些老脚本认它两个都设上更稳。Windows 下用setx写用户变量# 写用户变量新开终端生效 setx ARMLMD_LICENSE_FILE D:\Licenses\armcompiler5.06.lic setx LM_LICENSE_FILE D:\Licenses\armcompiler5.06.licsetx不会影响当前已经打开的终端也不影响已经启动的 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 -DDEBUG1 -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.06IDE 构建日志里还是旧路径。原因是 IDE 启动时继承环境变量改 PATH 后没有完全退出重启或者 IDE 工具链设置里还勾着“默认编译器”。解决方法是先完全关闭 IDE包括托盘进程再打开然后在工具链设置里手动指定armcc、armlink的完整路径清构建目录重编。# 看当前实际命中路径确认不是旧版 Get-Command armcc | Format-List Source where.exe armccwhere.exe会列出所有命中项第一个才是实际调用。如果第一个仍是旧路径把旧路径从用户 PATH 里删掉不要只在后面追加 5.06。5.3 现象链接时库版本不匹配现象是编译单个文件没问题链接时提示库文件格式不对、符号找不到或者 map 文件里工具版本不一致。原因多半是armcc用了 5.06armlink却命中了别的版本或者工程里混入了别的工具链编出来的.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直接报缺少 DLLLinux 下报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 foundfile显示 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.06map 文件链接后看头部工具版本为 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 和旧版本混用要省时间。希望帮到你。本文还有配套的精品资源点击获取