如何使用Cargo构建脚本生成Rust二进制程序?
首先,你遇到的核心问题是Cargo只会从固定目录(如src/bin)扫描二进制源文件,构建脚本生成在OUT_DIR的文件不在Cargo的扫描范围内,同时你生成的代码里main函数返回值不符合Rust规范。下面是两种可行的解决方案:
方案1:让Cargo识别生成的二进制(支持cargo run --bin)
这个方案会把生成的源文件放到项目目录下的固定位置,让Cargo可以找到它。
修改构建脚本:
将生成文件的路径从OUT_DIR改为项目根目录下的generated/bin目录,同时修复main函数的返回值错误:use std::env; use std::fs; use std::path::Path; fn main() { // 获取项目根目录路径 let project_root = Path::new(env!("CARGO_MANIFEST_DIR")); let gen_bin_dir = project_root.join("generated").join("bin"); fs::create_dir_all(&gen_bin_dir).unwrap(); let dest_path = gen_bin_dir.join("hello_from_build_script_binary.rs"); fs::write( &dest_path, "fn main() { println!(\"Hello from my build script binary!\"); } ", ) .unwrap(); }配置Cargo.toml:
在Cargo.toml末尾添加二进制目标的路径配置,告诉Cargo去哪里找这个二进制的源文件:[[bin]] name = "hello_from_build_script_binary" path = "generated/bin/hello_from_build_script_binary.rs"运行命令:
先执行构建让脚本生成文件,再运行二进制:cargo build cargo run --bin hello_from_build_script_binary
方案2:直接在构建脚本中编译二进制(无需Cargo识别)
如果不需要用cargo run --bin,可以让构建脚本直接编译生成的源文件为可执行文件,之后直接运行该文件即可。
修改构建脚本:
在生成源文件后,调用rustc编译它,并输出二进制文件的路径:use std::env; use std::fs; use std::path::Path; use std::process::Command; fn main() { let out_dir = env::var_os("OUT_DIR").unwrap(); let bin_dir = Path::new(&out_dir).join("bin"); fs::create_dir_all(&bin_dir).unwrap(); let src_path = bin_dir.join("hello_from_build_script_binary.rs"); fs::write( &src_path, "fn main() { println!(\"Hello from my build script binary!\"); } ", ) .unwrap(); // 编译源文件为二进制 let binary_path = bin_dir.join("hello_from_build_script_binary"); Command::new("rustc") .arg(&src_path) .arg("-o") .arg(&binary_path) .status() .expect("Failed to compile generated binary"); // 输出二进制路径到构建日志(以警告形式显示) println!("cargo:warning=Generated binary path: {}", binary_path.display()); }运行命令:
# 先执行构建,触发build.rs生成并编译二进制 cargo build # 根据日志中的路径运行二进制,示例路径如下(实际路径以日志为准) ./target/debug/build/your-crate-name-xxxxxx/out/bin/hello_from_build_script_binary
另外,你错误信息里的bello_from_build_script_binary是拼写错误(应该是hello),不过这不是核心问题,核心还是Cargo的路径扫描规则限制。
内容的提问来源于stack exchange,提问作者cowlicks
相关产品推荐
相关产品推荐

