【问题标题】:Why does Rust require a C++ toolchain to produce a Rust binary, while languages like Go do not have this requirement?为什么 Rust 需要 C++ 工具链来生成 Rust 二进制文件,而像 Go 这样的语言没有这个要求?
【发布时间】:2019-10-03 08:11:16
【问题描述】:

如果我没有安装 C++ 工具链,使用 rustc foo.rs 编译 Rust 文件会失败。但是在编译 Go 程序时,不需要这样的工具链。这是为什么呢?

【问题讨论】:

  • 注意:Rust 社区正在开发一个 Rust 后端 (cranelift) 作为 LLVM 的替代品(但不是替代品)。尽管如此,rustc 编译器仍然依赖于存在的 libc 实现。我认为 steed(嵌入式)和 relibc(Redox)是关于在 Rust 中重新实现 libc,但不清楚它们在哪里。
  • 我认为这个问题要么太宽要么太小,基本上答案是因为 rustc 需要它。长答案太宽泛了。
  • Rust 的答案是默认情况下它通过静态链接到 libc 进行编译。如果您使用标志进行动态链接,我想知道是否必须存在 C 工具链。不过,我对 Go 知之甚少,无法回答。
  • @Stargateur 如果您是编程新手,编译器基础结构可能非常神秘。问为什么一个看似无关的人依赖于另一个人是一个完全公平的问题。似乎编程也与我有关,但是现在有很多深奥的 SE,人们喜欢分裂头发。
  • @Svend 我没有说这不是主题,我说它太宽泛了。解释“编译器基础结构”过于宽泛。

标签: c++ go rust toolchain build-tools


【解决方案1】:

TL;DR:因为每个人都有一个 C 工具链。

轻微修正:rustc 不需要 C++ 工具链,它只需要 C 工具链。值得注意的是,rustc 创建的二进制文件仅依赖于libc(或等效),而不依赖于libstdc++(或等效)。


正如 Go 所展示的,可能不需要 C 工具链。你只需要重新实现它的功能:

  • 您需要实现自己的链接器,并尊重目标平台格式。
  • 您需要实现自己的 libc(也称为 OS 层)。

这样做有一些好处,例如可能更快的编译或更容易的交叉编译,但是在实现过程中是有成本的,很容易get things wrong


Rust 社区更愿意在语言上投入比在工具链上更多的精力,因此重用现有的工具链更容易。具体来说,rustc 需要一个平台链接器(Unix 上的ld)和相当于libc 的平台。

这不是核心设计原则,只是务实的做法,有项目可以减少这些依赖:

  • 使用 lld 而不是 ld 将允许使用可针对所有平台的 rustc 发布单个链接器。
  • 使用 cranelift 作为替代后端也可以消除对 ld 的依赖。
  • Redox 项目正在开发 relibc,这是 libc API 的可移植 Rust 实现。

这些都在进行中,同时 rustc 需要一个 C 工具链。此外,即使在可预见的未来,我也希望 rustc 需要一个 C 工具链来处理尚未被任何 Rust 工具链覆盖的目标,这样您就可以使用目标而无需等待一些假设的开发。

【讨论】:

  • 也许 OP 正在谈论 C++ 工具链,因为他使用的是 Windows 操作系统。看起来 C 和 C++ 工具链之间并没有明显的区别。
  • @FrenchBoiethios:可能。我澄清说这是一个不同的要求,而且是一个不那么繁重的要求。
  • 谢谢@MatthieuM。你在 Go 部分的答案就是我一直在寻找的,也感谢你解释 Rust 部分。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 2011-11-11
  • 2015-10-15
  • 2013-10-11
  • 2020-09-15
  • 1970-01-01
相关资源
最近更新 更多