Linux下用Cargo为Windows交叉编译时,如何指定带架构标识的输出文件名
实现Windows x86架构编译输出自定义文件名的方法
以下是几种可行的解决方案,按需选择即可:
方案一:编译后手动重命名(最简单)
直接在编译命令后追加重命名操作,一步完成编译与文件名修改:
cargo build --release --lib --target i686-pc-windows-gnu && mv target/i686-pc-windows-gnu/release/my_project.dll target/i686-pc-windows-gnu/release/my_project_x86.dll
无需修改任何配置文件,适合临时需求或简单场景。
方案二:通过Cargo.toml配置目标专属输出名
在项目根目录的Cargo.toml中添加针对i686-pc-windows-gnu的编译参数,让Cargo直接输出指定名称的DLL:
[package] # 保留你原有的package配置内容 [target.i686-pc-windows-gnu] # 给GNU链接器传递参数,指定输出文件名 rustc-flags = "-C linker-flags=-Wl,--output=my_project_x86.dll"
配置完成后,再次执行x86架构的编译命令,输出文件就会自动变为my_project_x86.dll。
方案三:用build.rs脚本自动化处理
在项目根目录创建build.rs文件,添加以下代码,让编译流程自动完成文件名修改:
use std::env; use std::fs; use std::path::PathBuf; fn main() { let target = env::var("TARGET").expect("Failed to get target"); let out_dir = PathBuf::from(env::var("OUT_DIR").expect("Failed to get out dir")); // 仅对Windows x86目标执行重命名 if target == "i686-pc-windows-gnu" { // 定位编译后的DLL文件路径 let src_dll = out_dir.parent().unwrap().parent().unwrap().join("my_project.dll"); let dest_dll = out_dir.parent().unwrap().parent().unwrap().join("my_project_x86.dll"); if src_dll.exists() { fs::rename(src_dll, dest_dll).expect("Failed to rename DLL"); } } }
然后在Cargo.toml中启用这个build脚本:
[package] # 保留原有配置,添加以下行 build = "build.rs"
此后每次编译x86目标时,脚本会自动将输出的DLL重命名为指定名称,适合需要全自动化的场景。
内容的提问来源于stack exchange,提问作者codewalker
相关产品推荐
相关产品推荐

