news 2026/11/4 21:44:33

keil5 自动生成 .elf文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
keil5 自动生成 .elf文件

想看更多嵌入式干货、工具技巧,踩坑记录,也欢迎关注:公众号:啊哈哈哈111

由于 keil5 默认不生成 .elf 文件,所以需要一个脚本实现编译项目的同时生成 .elf 文件,使用 e2 studio 或 STM32CubeIDE 这类 IDE 会自动生成.elf 文件。

  1. 1. 打开 keil5 安装目录的文件夹📂 Keil_v5 。

  1. 2. 在此目录下新建文件夹📂 Postbuild 。

  1. 3. 在新建的📂 Postbuild 文件夹下新建文件 postbuild.bat 。

  1. 4. 用记事本打开并复制粘贴下面的代码,然后保存。

@echo off setlocal enabledelayedexpansion rem ============================================================================== rem Post‑Build 脚本:自动调用 fromelf.exe 生成 ELF / BIN / HEX rem 2025‑07‑25 修正版 rem ============================================================================== rem ────────────────────────────────────────────────────────────────────────────── rem 【可选】手动指定 fromelf.exe 路径(如需固定版本,可取消下一行注释并修改) rem set "FROMELF=C:\Keil_v5\ARM\ARMCLANG\bin\fromelf.exe" rem ────────────────────────────────────────────────────────────────────────────── rem —— 缓存文件(存储已找到的 fromelf.exe 全路径) —— set "CACHE_FILE=%~dp0fromelf_path.cache" rem ============================================================================== rem 1) 自动查找 fromelf.exe rem ============================================================================== if not defined FROMELF ( rem 1‑a 从缓存读取 if exist "%CACHE_FILE%" ( set /p FROMELF=<"%CACHE_FILE%" if exist "!FROMELF!" ( echo [PostBuild] Found from cache: !FROMELF! ) else ( echo [PostBuild] Cache invalid, deleting... del "%CACHE_FILE%" 2>nul set "FROMELF=" ) ) rem 1‑b 已知路径(Keil 根目录下 ARM\ARMCLANG 或 ARM\ARMCC) if not defined FROMELF ( rem ▼▼▼ 关键修复:正确获取上一级目录完整路径 ▼▼▼ for %%I in ("%~dp0..") do set "KEIL_ROOT=%%~fI" rem ▲▲▲ 关键修复完毕 ▲▲▲ if exist "!KEIL_ROOT!\ARM\ARMCLANG\bin\fromelf.exe" ( set "FROMELF=!KEIL_ROOT!\ARM\ARMCLANG\bin\fromelf.exe" ) else if exist "!KEIL_ROOT!\ARM\ARMCC\bin\fromelf.exe" ( set "FROMELF=!KEIL_ROOT!\ARM\ARMCC\bin\fromelf.exe" ) if defined FROMELF ( echo [PostBuild] Found at known path: !FROMELF! echo !FROMELF!>"%CACHE_FILE%" ) ) rem 1‑c 递归搜索(最后手段) if not defined FROMELF ( echo [PostBuild] Recursively searching under "!KEIL_ROOT!"... for /f "delims=" %%F in ('where /r "!KEIL_ROOT!" fromelf.exe 2^>nul') do ( set "FROMELF=%%~F" goto :FOUND_FROMELF ) echo [Error] Could not find fromelf.exe under "!KEIL_ROOT!". exit /b 1 ) ) :FOUND_FROMELF echo [PostBuild] Using fromelf.exe: !FROMELF! rem ============================================================================== rem 2) 参数检查 rem ============================================================================== if "%~1"=="" ( echo [Error] No .axf file path provided. echo [Info ] Please configure Keil “After Build / User Command” 类似: echo C:\Keil_v5\Postbuild\postbuild.bat "#L" exit /b 1 ) rem .axf 完整路径 set "fullpath=%~1" rem ============================================================================== rem 3) 用户开关(1=启用,0=禁用) rem ============================================================================== set GENERATE_ELF=1 set GENERATE_BIN=0 set GENERATE_HEX=0 rem ============================================================================== rem 4) 提取文件名(name) 和 输出目录(dir) rem ============================================================================== for %%A in ("!fullpath!") do ( set "name=%%~nA" set "dir=%%~dpA" ) rem 去掉末尾反斜杠 set "dir=!dir:~0,-1!" echo. echo [PostBuild] Processing: !fullpath! echo [PostBuild] Output Dir: !dir! rem ============================================================================== rem 5) 生成文件 rem ============================================================================== if "!GENERATE_ELF!"=="1" ( echo [PostBuild] Generating ELF... "!FROMELF!" --elf --output "!dir!\!name!.elf" "!fullpath!" ) if "!GENERATE_BIN!"=="1" ( echo [PostBuild] Generating BIN... "!FROMELF!" --bin --output "!dir!\!name!.bin" "!fullpath!" ) if "!GENERATE_HEX!"=="1" ( echo [PostBuild] Generating HEX... "!FROMELF!" --i32 --output "!dir!\!name!.hex" "!fullpath!" ) echo [PostBuild] Done. endlocal
  1. 5. 打开 keil5 的项目,打开 "Options for Target..." (魔术棒图标 🪄)。切换到 "User" 选项卡。找到 "After Build/Rebuild" 下的 "User Command" 并勾选"Run#1"。点击文件夹📂图标,选中之前新建postbuild.bat 文件并打开,在点击"User Command"修改该命令,在命令的最后加上 空格"#L" "#L",最后点击 OK。

  1. 6. keil5 中点击编译,出现如下表示生成 .elf 文件成功,现在每次编译都会生成,生成的文件在.hex 文件同目录: [PostBuild] Generating ELF... [PostBuild] Done.

如果.bat 脚本没有自动查找到 fromelf.exe , 请手动修改路径。

完整步骤视频:

MCUViewer

想看更多嵌入式干货、工具技巧,踩坑记录,也欢迎关注:公众号:啊哈哈哈111

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 7:50:54

深入Spring Boot源码(六):Actuator端点与监控机制深度解析

前言在生产环境中&#xff0c;应用的监控和管理是至关重要的。Spring Boot Actuator模块提供了丰富的生产就绪特性&#xff0c;帮助开发者监控应用状态、收集运行时指标、管理应用配置等。本文将深入Actuator的内部机制&#xff0c;解析端点的实现原理、健康检查机制、指标收集…

作者头像 李华
网站建设 2026/11/5 18:25:09

31、深入理解动态内存分配与数据对齐

深入理解动态内存分配与数据对齐 1. 动态内存分配概述 在编程中,动态内存分配是一项关键技术,用于在程序运行时获取和管理内存。与自动和静态变量不同,动态内存是在运行时分配的,其大小可能在分配时才确定。例如,当需要存储文件内容或用户输入时,由于文件大小和用户输入…

作者头像 李华
网站建设 2026/11/5 11:13:13

Tessy集成测试-同一module复制粘贴后新的module执行报错

1_背景 在测试接口过程中&#xff0c;因后续报告需要匹配问题&#xff0c;同一module里的用例较多&#xff0c;生成报告后需要手动匹配对应接口文件夹&#xff0c;所以想法是在测试阶段一条module对应一条用例&#xff0c;那么有些接口调用关系相同&#xff0c;所以只需要粘贴复…

作者头像 李华
网站建设 2026/11/5 2:03:22

3步搞定SeedVR2-7B本地部署:AI视频修复终极指南

3步搞定SeedVR2-7B本地部署&#xff1a;AI视频修复终极指南 【免费下载链接】SeedVR2-7B 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/SeedVR2-7B 想要在本地运行强大的AI视频修复模型吗&#xff1f;SeedVR2-7B作为字节跳动推出的先进视频修复工具&am…

作者头像 李华
网站建设 2026/11/4 20:44:00

Qt界面美化终极指南:10款免费QSS模板快速提升程序颜值

Qt界面美化终极指南&#xff1a;10款免费QSS模板快速提升程序颜值 【免费下载链接】QSS QT Style Sheets templates 项目地址: https://gitcode.com/gh_mirrors/qs/QSS 想要让Qt应用界面告别单调乏味&#xff0c;瞬间拥有专业级视觉效果吗&#xff1f;Qt界面美化从未如此…

作者头像 李华
网站建设 2026/11/5 3:53:02

VAM插件管理器:告别Vim插件管理的混乱时代

VAM插件管理器&#xff1a;告别Vim插件管理的混乱时代 【免费下载链接】vim-addon-manager manage and install vim plugins (including their dependencies) in a sane way. If you have any trouble contact me. Usually I reply within 24 hours 项目地址: https://gitcod…

作者头像 李华