【问题标题】:Is it possible to speed up Rust compilation when linking a large library?链接大型库时是否可以加快 Rust 编译?
【发布时间】:2018-08-20 13:26:38
【问题描述】:

Servo 作为我的二进制文件的一部分嵌入时,我遇到了很长的连续构建时间。例如,使用这个tutorial for embedding Servo,在初始构建完成后,对我的代码的任何修改都需要 40s+ 才能在第四代四核 i7 上重建二进制文件:

这是 Cargo 的示例输出:

❯ cargo build
    Finished dev [unoptimized + debuginfo] target(s) in 0.1 secs

❯ touch src/main.rs
❯ cargo build
    Compiling servo-embedding-example v0.1.0
     Finished dev [unoptimized + debuginfo] target(s) in 57.9 secs

我正在运行一个最近的夜间工具链:

❯ rustc --version
rustc 1.25.0-nightly (15a1e2844 2018-01-20)
❯ cargo --version
cargo 0.26.0-nightly (6a8eb71f6 2018-01-13)

增量构建已开启:

❯ echo $CARGO_INCREMENTAL
1

我不打算经常更新 Servo,但我的应用程序需要它。有什么方法可以加快构建时间?

【问题讨论】:

  • 货物是作为静态库嵌入的吗?如果是这样,将其嵌入为动态库(至少在 Debug 中)不会加快链接时间吗?

标签: build compilation linker rust rust-cargo


【解决方案1】:

您可以做的一件事是将直接与 Servo 交互的代码与项目的其余部分分离到项目中自己的库中。

project-rs
├── Cargo.toml
├── src
│   ├── bin
│   │   └── main.rs
│   ├── this_needs_servo
│   │   └── Cargo.toml
│   │   └── lib.rs
│   └── ui
│       └── Cargo.toml
│       └── lib.rs
└── tests
    └── tests.rs

你会添加

[dependencies.this_needs_servo]
path = "src/this_needs_servo"

到您项目根目录中的 Cargo.toml 并将 servo 的依赖项移动到您的 this_needs_servo 库下的 Cargo.toml 中。

要使用此库,您可以将 extern crate this_needs_servo; 以及所有必需的 use 语句添加到您的 main.rs。

现在 servo 只有在您更改 this_needs_servo 库中的某些内容时才会被编译。

【讨论】:

  • 这似乎不会回答问题,因为它询问有关修复 链接时间 的问题,此解决方案不会更改此问题。
  • 对不起,如果我误解了这个问题。我认为这可能会有所帮助,因为看起来编译伺服需要 OP 这么长时间。编译后不会发生 Rust 中的链接吗?我应该删除我的答案吗?
  • @クリホ 我会等待 OP 的评论。
  • 我认为分而治之的解决方案是通用的,也是最好的。这是因为它是通用的,也是唯一的。
  • 召唤@Shepmaster .
猜你喜欢
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
相关资源
最近更新 更多