【问题标题】:What exactly is a "library" in a crate?板条箱中的“库”到底是什么?
【发布时间】:2021-07-02 10:31:54
【问题描述】:

我对 rust 中的“库”这个概念有点困惑,这是在“A crate is a binary or library”中提到的。

如果我是对的,二进制表示可执行程序(例如,可以从 shell 运行),但什么是库?

它们是某种带有 .a 或 .so 等符号的目标文件,它们将链接到我的程序(如 C/C++)

或者它们是纯源代码,将与我的程序一起编译?

【问题讨论】:

    标签: rust rust-cargo


    【解决方案1】:

    正如 Masklinn 所述,是的,Rust 确实具有预构建的库格式。但是,这些主要在内部使用,对于不同的编译器版本和cargo still lacks support for them 来说都是有限的。实际上, crates.io 要求库是“开源的”(例如,您提供源代码,您仍然可以从某些闭源依赖项中加载源代码),并将源代码分发给任何下载的人箱子。然后,源代码与您的程序一起有效地编译(这是 rlibs 发挥作用的地方,但 cargo 不会将其暴露给用户)。这也是您能够检查几乎每个 crate 的源代码的原因。

    【讨论】:

    • 您是否建议即使同时支持源代码和预构建格式,但目前大多数 crate 都使用源代码?
    • 我建议源代码是唯一得到良好支持的格式,并且预构建的 crate 几乎只在 cargo 内部使用,绝大多数 的 crates(包括 crates.io 上的所有内容)在某种程度上都有源代码。
    【解决方案2】:

    如果我是对的,二进制表示可执行程序(例如,可以从 shell 运行),但什么是库?

    是的。具体来说,根据the Linkage documentation

    将生成一个可运行的可执行文件。这要求 crate 中有一个 main 函数,该函数将在程序开始执行时运行。这将链接所有 Rust 和本机依赖项,​​生成一个可分发的二进制文件。这是默认的 crate 类型。

    它们是某种带有 .a 或 .so 等符号的目标文件,它们将链接到我的程序(如 C/C++)

    或者它们是纯源代码,将与我的程序一起编译?

    从不严格是后者,但确切的人工制品取决于链接文档:

    将生成一个 Rust 库。这是一个关于究竟产生什么的模棱两可的概念,因为图书馆可以以多种形式表现自己。这个通用库选项的目的是生成“编译器推荐”风格的库。 rustc 始终可以使用输出库,但库的实际类型可能会随时更改。

    然后文档列出了各种类型的库:

    • rlib,一个带有 rust 特定元数据的静态库(一个增强的 .a)
    • dylib,一个带有 rust 特定元数据的动态库(一个增强的 .so)
    • staticlib,一个系统静态库(一个实际的.a)
    • cdylib,一个系统动态库(一个实际的.so)

    我认为“lib”是“rlib”的别名,但坦率地说,我不知道,正如引用所指出的那样,这既不是固定的,也不是按设计记录的

    【讨论】:

    • 看来,不管是什么形式,库都不是由源代码组成的,对吧?但是为什么我可以跳到我导入的一些库来检查代码呢?如果cargo能找到库的源代码,是不是这样做的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多