【发布时间】:2021-07-02 10:31:54
【问题描述】:
我对 rust 中的“库”这个概念有点困惑,这是在“A crate is a binary or library”中提到的。
如果我是对的,二进制表示可执行程序(例如,可以从 shell 运行),但什么是库?
它们是某种带有 .a 或 .so 等符号的目标文件,它们将链接到我的程序(如 C/C++)
或者它们是纯源代码,将与我的程序一起编译?
【问题讨论】:
标签: rust rust-cargo
我对 rust 中的“库”这个概念有点困惑,这是在“A crate is a binary or library”中提到的。
如果我是对的,二进制表示可执行程序(例如,可以从 shell 运行),但什么是库?
它们是某种带有 .a 或 .so 等符号的目标文件,它们将链接到我的程序(如 C/C++)
或者它们是纯源代码,将与我的程序一起编译?
【问题讨论】:
标签: rust rust-cargo
正如 Masklinn 所述,是的,Rust 确实具有预构建的库格式。但是,这些主要在内部使用,对于不同的编译器版本和cargo still lacks support for them 来说都是有限的。实际上, crates.io 要求库是“开源的”(例如,您提供源代码,您仍然可以从某些闭源依赖项中加载源代码),并将源代码分发给任何下载的人箱子。然后,源代码与您的程序一起有效地编译(这是 rlibs 发挥作用的地方,但 cargo 不会将其暴露给用户)。这也是您能够检查几乎每个 crate 的源代码的原因。
【讨论】:
如果我是对的,二进制表示可执行程序(例如,可以从 shell 运行),但什么是库?
是的。具体来说,根据the Linkage documentation
将生成一个可运行的可执行文件。这要求 crate 中有一个 main 函数,该函数将在程序开始执行时运行。这将链接所有 Rust 和本机依赖项,生成一个可分发的二进制文件。这是默认的 crate 类型。
它们是某种带有 .a 或 .so 等符号的目标文件,它们将链接到我的程序(如 C/C++)
或者它们是纯源代码,将与我的程序一起编译?
从不严格是后者,但确切的人工制品取决于链接文档:
将生成一个 Rust 库。这是一个关于究竟产生什么的模棱两可的概念,因为图书馆可以以多种形式表现自己。这个通用库选项的目的是生成“编译器推荐”风格的库。 rustc 始终可以使用输出库,但库的实际类型可能会随时更改。
然后文档列出了各种类型的库:
我认为“lib”是“rlib”的别名,但坦率地说,我不知道,正如引用所指出的那样,这既不是固定的,也不是按设计记录的。
【讨论】: