4

这个问题是在 Rust 正式支持增量编译之前被问到的。Rust 1.24.0及更高版本默认为开发(调试)构建启用增量编译。

我是一个局外人,想看看 Rust 是否适合我的项目。

我读过 Rust 缺乏增量编译(尽管有 beta 功能)。

  1. 这是否类似于在 C++ 的头文件中实现所有内容(就像在Boost的大部分内容中一样)?

  2. 如果以上是正确的,这是否将 Rust 限制在具有小依赖关系的相当小的项目中?(比如说,如果QtKDE是只有头文件的库,那么使用它们的程序开发起来会非常痛苦,因为每次你想编译自己的代码时都会有效地重新编译 Qt/KDE。)

4

1 回答 1

8

在 C 和 C++ 中,一个编译单元通常是一个源文件和它传递的所有头文件。应用程序或库通常由链接在一起的多个编译单元组成。应用程序或库还可以与其他库链接。这意味着更改源文件只需要重新编译该源文件然后重新链接,更改外部库只需要重新链接,但更改头文件(无论是项目的一部分还是外部的;编译器无法区分)需要重新编译所有使用它的源文件,然后重新链接。

在 Rust 中,crate 是编译单元。(一个 crate 可以是一个应用程序或一个库。)Rust 不使用头文件。相反,等效信息作为元数据存储在已编译的 crates 中(解析速度更快,并且与 C/C++ 中的预编译头文件具有相同的效果)。一个板条箱还可以与其他板条箱链接。这意味着更改 crate 的任何源文件都需要重新编译整个 crate,而更改 crate 需要重新编译依赖它的所有 crate(目前,这意味着从源重新编译,即使 API 碰巧没有更改)。

为了回答您的问题,不,Rust 不会在您每次重新编译项目时重新编译所有依赖项。事实上恰恰相反。

Rust 中的增量编译是关于重用以前的 crate 编译中完成的工作以加快编译时间。例如,如果您更改了一个模块并且它不会影响其他模块,那么编译器将能够重用上次编译其他模块时生成的数据。缺乏增量编译通常只是大型或复杂 crate 的问题(例如,那些大量使用宏的)。

于 2017-06-04T00:22:26.977 回答