You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Cargo构建脚本生成Rust二进制程序?

首先,你遇到的核心问题是Cargo只会从固定目录(如src/bin)扫描二进制源文件,构建脚本生成在OUT_DIR的文件不在Cargo的扫描范围内,同时你生成的代码里main函数返回值不符合Rust规范。下面是两种可行的解决方案:


方案1:让Cargo识别生成的二进制(支持cargo run --bin)

这个方案会把生成的源文件放到项目目录下的固定位置,让Cargo可以找到它。

  1. 修改构建脚本:
    将生成文件的路径从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();
    }
    
  2. 配置Cargo.toml:
    在Cargo.toml末尾添加二进制目标的路径配置,告诉Cargo去哪里找这个二进制的源文件:

    [[bin]]
    name = "hello_from_build_script_binary"
    path = "generated/bin/hello_from_build_script_binary.rs"
    
  3. 运行命令:
    先执行构建让脚本生成文件,再运行二进制:

    cargo build
    cargo run --bin hello_from_build_script_binary
    

方案2:直接在构建脚本中编译二进制(无需Cargo识别)

如果不需要用cargo run --bin,可以让构建脚本直接编译生成的源文件为可执行文件,之后直接运行该文件即可。

  1. 修改构建脚本:
    在生成源文件后,调用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());
    }
    
  2. 运行命令:

    # 先执行构建,触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:47:47