目标目录中哪些文件实际上是可执行文件所需的?

27
在编译我的程序'zagir'之后,发布文件夹的大小超过了200MiB,这对于我编写的程序来说是荒谬的。因此,我试图检查是否只有'zagir'可执行文件在独立运行,结果确实如此。
但困惑的是,发布文件夹还包括libzagir.rlib文件以及.d文件和一堆其他文件夹。
  1. 它们究竟是什么?
  2. 它们真的是必需的吗?
  3. 当忽略这些文件时,我会在执行过程中遇到错误吗?
  4. 哪些文件应该打包成完整的可执行文件?
Cargo.toml
[package]
authors = ["Sharad Chand"]
name = "zagir"
version = "0.1.0"

[dependencies]
bcrypt = "0.1.3"
dotenv = "0.10.1"
image = "0.17.0"
log = "0.3.8"
r2d2 = "0.7.3"
r2d2-diesel = "0.16.0"
rand = "0.3.16"
rocket = "0.3.2"
rocket_codegen = "0.3.2"
serde = "1.0.11"
serde_derive = "1.0.11"
serde_json = "1.0.2"
validator = "0.6.0"
validator_derive = "0.6.0"

[dependencies.bigdecimal]
features = ["serde"]
version = "0.0.10"

[dependencies.chrono]
features = ["serde"]
version = "0.4.0"

[dependencies.diesel]
features = [
    "mysql",
    "chrono",
    "unstable",
    "numeric",
    "huge-tables",
]
version = "0.16.0"

[dependencies.diesel_codegen]
features = ["mysql"]
version = "0.16.0"

[dependencies.rocket_contrib]
features = ["handlebars_templates"]
version = "0.3.2"

[dependencies.uuid]
features = ["v4"]
version = "0.4"

1
请发布您项目的 Cargo.toml 文件。 - E net4
我在 target/release/deps 目录下也有 rlibs - pepsighan
1
我相信这个“一堆”其他文件主要是由cargo使用的,以避免在后续构建中重新执行操作。例如,“deps”包含用于可执行文件构建的依赖项。还有可能有项目的其他元数据,以允许cargo进行增量构建,而不是每次重新构建所有内容(例如.fingerprint文件夹)。不幸的是,我无法找到任何相关的文档。 - Adonis
1个回答

38
目标目录中实际上只需要可执行文件本身,除此之外没有其他文件是必需的。默认情况下,Rust 生成静态链接二进制文件。其他文件仅是由 Cargo 维护的构建工件,以使重新构建代码更加高效。它们包括诸如依赖项之类的东西。
以下是您可能会发现的一些文件的非全面示例:
* .d — 可与 Makefile 兼容的依赖项列表 * .rlib — Rust 库文件。 包含依赖项的已编译代码 * build — 构建脚本用作临时空间的目录 * deps — 已编译的依赖项 * examples — 来自 examples 目录的二进制文件 * incremental — 增量编译缓存的目录 * *-{hash} — 来自 cargo test 的二进制文件 * executables — 您的目标二进制文件
其中一些在 Cargo 源代码中有记录

很好的回答,只是出于好奇,你有提到所有这些的文档链接吗? - Adonis
1
@Adonis 不是很确定,但源代码中有一些信息(我现在已经链接了)。我认为特定的文件布局不被视为“公共API”,因此我不会真正期望公共文档。 - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接