cargo build 默认行为
cargo build
的默认行为
1. 编译项目
- 编译当前项目的 代码 和 依赖。
- 如果项目的代码或依赖没有变化,Cargo 会跳过重新编译。
2. 生成调试构建
默认情况下,
cargo build
会生成 调试构建,即未进行优化的构建。生成的二进制文件体积较大,执行效率相对较低,但编译速度更快。输出的目标文件位于:
1
target/debug/
示例:
1
target/debug/<project_name>
3. 检查依赖版本和缓存
- Cargo 会检查
Cargo.toml
和Cargo.lock
文件中定义的依赖版本。如果有新的依赖或依赖发生更改,会下载或重新编译依赖。 - 已经下载和编译过的依赖会缓存于
$CARGO_HOME/registry
和target
目录中,无需每次重新下载或编译。
4. 生成二进制目标
- 编译项目中定义的 二进制目标,例如:
- 默认目标是
src/main.rs
。 - 如果项目包含多个二进制目标(通过
[[bin]]
定义),需要显式指定目标。
- 默认目标是
5. 运行构建脚本
- 如果项目包含一个
build.rs
文件,Cargo 会先执行这个构建脚本,生成所需的中间文件或代码。 - 生成的文件会放在
OUT_DIR
指定的路径下(通常位于target/debug/build/<crate_name>/out/
)。
补充行为
1. 调试构建 vs. 发布构建
cargo build
默认执行 调试构建。如果需要优化后的二进制文件,可以使用发布模式:
1
cargo build --release
输出路径为:
1
target/release/
发布构建会启用优化(
-C opt-level=3
),适合生产环境。
2. 多目标项目
如果项目包含多个二进制目标或库目标,默认情况下,cargo build
会构建所有目标。可以通过以下方式构建特定目标:
指定二进制目标:
1
cargo build --bin <binary_name>
指定库目标:
1
cargo build --lib
3. 平台相关编译
cargo build
默认构建当前主机平台的二进制文件。如果需要为其他平台构建,可以通过
--target
指定目标平台:1
cargo build --target <target_triple>
示例:
1
cargo build --target x86_64-unknown-linux-gnu
4. 并行编译
- Cargo 默认启用并行编译,会利用多核 CPU 提高构建速度。
环境变量影响行为
cargo build
的行为可能受到以下环境变量的影响:
RUSTFLAGS
自定义传递给编译器的选项。例如:
1
RUSTFLAGS="-C target-cpu=native" cargo build
CARGO_TARGET_DIR
自定义构建输出目录。例如:
1
CARGO_TARGET_DIR=custom_target_dir cargo build
CARGO_HOME
- 更改 Cargo 的本地缓存目录。
OUT_DIR
- 控制
build.rs
生成的中间文件存放目录。
- 控制
默认流程
解析依赖:
- 检查
Cargo.toml
和Cargo.lock
,解析所有依赖及其版本。 - 下载或检查缓存中的依赖。
- 检查
运行构建脚本:
- 如果项目中包含
build.rs
,则执行构建脚本并生成中间代码或文件。
- 如果项目中包含
编译依赖:
- 依赖按照解析顺序逐个编译,生成
.rlib
或其他目标文件。
- 依赖按照解析顺序逐个编译,生成
编译主项目:
- 编译项目的主代码(
src/lib.rs
或src/main.rs
),生成二进制目标或库目标。
- 编译项目的主代码(
输出结果:
- 将生成的文件存放在
target/debug/
或指定的输出目录。
- 将生成的文件存放在
常用命令
调试构建:
1
cargo build
发布构建:
1
cargo build --release
构建指定目标:
1
cargo build --bin <binary_name>
查看构建过程:
1
cargo build -vv
cargo build 默认行为
https://abrance.github.io/2024/11/25/mdstorage/domain/rust/cargo build 默认行为/