想看更多嵌入式干货、工具技巧,踩坑记录,也欢迎关注:公众号:啊哈哈哈111
由于 keil5 默认不生成 .elf 文件,所以需要一个脚本实现编译项目的同时生成 .elf 文件,使用 e2 studio 或 STM32CubeIDE 这类 IDE 会自动生成.elf 文件。
1. 打开 keil5 安装目录的文件夹📂 Keil_v5 。
2. 在此目录下新建文件夹📂 Postbuild 。
3. 在新建的📂 Postbuild 文件夹下新建文件 postbuild.bat 。
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. endlocal5. 打开 keil5 的项目,打开 "Options for Target..." (魔术棒图标 🪄)。切换到 "User" 选项卡。找到 "After Build/Rebuild" 下的 "User Command" 并勾选"Run#1"。点击文件夹📂图标,选中之前新建postbuild.bat 文件并打开,在点击"User Command"修改该命令,在命令的最后加上 空格"#L" "#L",最后点击 OK。
6. keil5 中点击编译,出现如下表示生成 .elf 文件成功,现在每次编译都会生成,生成的文件在.hex 文件同目录: [PostBuild] Generating ELF... [PostBuild] Done.
如果.bat 脚本没有自动查找到 fromelf.exe , 请手动修改路径。
完整步骤视频:
MCUViewer
想看更多嵌入式干货、工具技巧,踩坑记录,也欢迎关注:公众号:啊哈哈哈111