news 2026/2/28 5:36:59

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/2/27 14:17:52

从零搭建量子ML可视化环境,手把手教你配置VSCode的6个关键插件

第一章&#xff1a;量子机器学习的 VSCode 数据可视化在量子机器学习研究中&#xff0c;数据可视化是理解高维量子态与模型行为的关键环节。借助 Visual Studio Code&#xff08;VSCode&#xff09;强大的扩展生态&#xff0c;开发者能够将复杂的量子计算结果以直观图形呈现&am…

作者头像 李华
网站建设 2026/2/26 8:07:46

Azure CLI导出量子计算结果的隐藏命令,资深工程师不愿透露的秘密

第一章&#xff1a;Azure CLI量子作业结果导出概述在使用 Azure Quantum 服务进行量子计算实验时&#xff0c;用户通常需要将作业执行结果导出至本地或第三方系统进行后续分析。Azure CLI 提供了一套简洁高效的命令行接口&#xff0c;支持用户查询、获取并导出量子作业的运行结…

作者头像 李华
网站建设 2026/2/23 4:06:17

从零构建边缘Docker监控体系(含Prometheus+Grafana实战配置)

第一章&#xff1a;边缘Docker监控的挑战与架构设计 在边缘计算环境中&#xff0c;Docker容器广泛用于部署轻量级、可移植的应用服务。然而&#xff0c;受限的硬件资源、网络不稳定性和地理分布特性&#xff0c;给监控系统的构建带来了显著挑战。传统的集中式监控方案难以适应边…

作者头像 李华
网站建设 2026/2/26 3:56:08

5个关键技巧:完全掌握DuckDB与C++嵌入式数据库集成

5个关键技巧&#xff1a;完全掌握DuckDB与C嵌入式数据库集成 【免费下载链接】duckdb 项目地址: https://gitcode.com/gh_mirrors/duc/duckdb 还在为C应用寻找合适的数据存储方案而烦恼吗&#xff1f;想要在应用中嵌入高性能分析能力却担心复杂的依赖关系&#xff1f;D…

作者头像 李华
网站建设 2026/2/17 19:31:35

macOS窗口管理终极指南:开源工具完全手册

macOS窗口管理终极指南&#xff1a;开源工具完全手册 【免费下载链接】open-source-mac-os-apps serhii-londar/open-source-mac-os-apps: 是一个收集了众多开源 macOS 应用程序的仓库&#xff0c;这些应用程序涉及到各种领域&#xff0c;例如编程、生产力工具、游戏等。对于开…

作者头像 李华
网站建设 2026/2/26 13:14:09

告别重复搭建,一键生成量子项目:VSCode Azure QDK模板终极指南

第一章&#xff1a;告别重复搭建&#xff0c;一键生成量子项目在量子计算开发中&#xff0c;项目初始化往往涉及复杂的依赖配置、环境校准与模板文件创建。开发者频繁重复相同的结构搭建流程&#xff0c;不仅耗时&#xff0c;还容易引入人为错误。为解决这一痛点&#xff0c;现…

作者头像 李华