cargo build 默认行为

cargo build 的默认行为

1. 编译项目

  • 编译当前项目的 代码依赖
  • 如果项目的代码或依赖没有变化,Cargo 会跳过重新编译。

2. 生成调试构建

  • 默认情况下,cargo build 会生成 调试构建,即未进行优化的构建。生成的二进制文件体积较大,执行效率相对较低,但编译速度更快。

  • 输出的目标文件位于:

    1
    target/debug/

    示例:

    1
    target/debug/<project_name>

3. 检查依赖版本和缓存

  • Cargo 会检查 Cargo.tomlCargo.lock 文件中定义的依赖版本。如果有新的依赖或依赖发生更改,会下载或重新编译依赖。
  • 已经下载和编译过的依赖会缓存于 $CARGO_HOME/registrytarget 目录中,无需每次重新下载或编译。

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 的行为可能受到以下环境变量的影响:

  1. RUSTFLAGS

    • 自定义传递给编译器的选项。例如:

      1
      RUSTFLAGS="-C target-cpu=native" cargo build
  2. CARGO_TARGET_DIR

    • 自定义构建输出目录。例如:

      1
      CARGO_TARGET_DIR=custom_target_dir cargo build
  3. CARGO_HOME

    • 更改 Cargo 的本地缓存目录。
  4. OUT_DIR

    • 控制 build.rs 生成的中间文件存放目录。

默认流程

  1. 解析依赖

    • 检查 Cargo.tomlCargo.lock,解析所有依赖及其版本。
    • 下载或检查缓存中的依赖。
  2. 运行构建脚本

    • 如果项目中包含 build.rs,则执行构建脚本并生成中间代码或文件。
  3. 编译依赖

    • 依赖按照解析顺序逐个编译,生成 .rlib 或其他目标文件。
  4. 编译主项目

    • 编译项目的主代码(src/lib.rssrc/main.rs),生成二进制目标或库目标。
  5. 输出结果

    • 将生成的文件存放在 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 默认行为/
Author
xiaoy
Posted on
November 25, 2024
Licensed under