如何获取Cargo生成的target/*/deps目录下带哈希后缀的准确文件名
方案1:使用Cargo JSON输出(官方推荐,最稳定)
Cargo支持输出编译过程的结构化JSON消息,你可以直接解析该输出获取准确的生成文件路径,不受哈希变化、Cargo版本更新的影响。
执行命令时添加--message-format=json参数:
cargo rustc --release -- --emit=llvm-ir --message-format=json
输出中reason为compiler-artifact的条目下,filenames字段会包含本次编译生成的所有文件的完整绝对路径,你可以用jq等工具过滤出你需要的.ll文件。
在Makefile中示例用法:
# 单个包的.ll文件获取示例 CHIP8_ENGINE_LL := $(shell cargo rustc --release --package chip8_engine -- --emit=llvm-ir --message-format=json \ | jq -r 'select(.reason == "compiler-artifact") | .filenames[] | select(endswith(".ll"))') # 后续可以直接使用变量 echo $(CHIP8_ENGINE_LL)
方案2:通配符匹配(适合简单场景)
如果不想引入JSON解析依赖,可以直接通过固定前缀的通配符匹配目标文件,建议同时按修改时间排序取最新文件,避免匹配到历史编译残留的旧文件:
# 获取chip8_engine最新生成的.ll文件 find target/release/deps -name "chip8_engine-*.ll" -printf "%T@ %p\n" | sort -n | tail -n 1 | cut -d' ' -f2-
在Makefile中示例用法:
CHIP8_C64_LL := $(shell find target/release/deps -name "chip8_c64-*.ll" -printf "%T@ %p\n" | sort -n | tail -n 1 | cut -d' ' -f2-)
注意:使用该方案前如果要保证完全准确,可以先执行
cargo clean清理历史构建产物,避免多版本文件残留。
内容的提问来源于stack exchange,提问作者Cactus
相关产品推荐
相关产品推荐

