设置build.target-dir后,同名Rust项目二进制如何输出到各自target目录?
Rust Cargo 编译产物目录配置问题解答
基础问题:如何让Cargo将二进制文件输出到当前项目的target目录?
Cargo 默认行为就是将编译产物(包括二进制文件)输出到当前项目根目录下的target文件夹中。如果你的环境中产物没有输出到这个位置,大概率是配置了全局或项目级的build.target-dir覆盖了默认设置,恢复方式如下:
- 项目级配置恢复:删除项目根目录下
.cargo/config.toml(或旧格式的.cargo/config)中[build]区块下的target-dir配置项。 - 全局配置恢复:删除用户目录下
~/.cargo/config.toml(Windows 系统路径为%USERPROFILE%\.cargo\config.toml)中对应的target-dir配置项。
具体场景解决方案:同名项目编译产物独立输出
针对你提到的两个同名项目/dir1/my-rust和/dir2/my-rust,因共享target-dir导致产物覆盖的问题,给出以下几种无需依赖sccache的解决方案:
方案1:恢复Cargo默认行为(推荐)
直接移除全局或共享的target-dir配置,让每个项目自动在自身根目录生成独立的target文件夹。编译后产物会分别输出到:
/dir1/my-rust/target/release/my-rust/dir2/my-rust/target/release/my-rust
这种方式最简洁,完全符合Cargo的设计逻辑,产物互不干扰。
方案2:项目级配置覆盖全局target-dir
如果因某些原因必须保留全局缓存配置,可在每个项目的.cargo/config.toml中单独设置本地target-dir:
[build] target-dir = "./target"
项目级配置优先级高于全局配置,这样每个项目编译时会将产物输出到自身根目录的target文件夹中。
方案3:编译时临时指定target-dir
无需修改任何配置文件,每次编译时通过命令行参数指定输出目录:
# Release 版本编译 cargo build --release --target-dir ./target
这种方式适合临时需要指定输出目录的场景,灵活性强。
方案4:修改二进制文件名(备选)
如果不想调整target目录结构,也可以在每个项目的Cargo.toml中修改二进制产物的名称,避免文件名冲突:
# 在 /dir1/my-rust/Cargo.toml 中设置 [[bin]] name = "my-rust-dir1" path = "src/main.rs" # 在 /dir2/my-rust/Cargo.toml 中设置 [[bin]] name = "my-rust-dir2" path = "src/main.rs"
编译后会生成不同名称的二进制文件,即使放到同一目录也不会覆盖,但该方案不如前三种直观。
内容的提问来源于stack exchange,提问作者0x01
相关产品推荐
相关产品推荐

