c++ - 为什么 Rust 需要 C++ 工具链来生成 Rust 二进制文件,而像 Go 这样的语言没有这个要求?

标签 c++ go rust toolchain build-tools

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

最佳答案

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

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


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

  • 您需要根据目标平台格式实现自己的链接器。
  • 您需要实现自己的 libc(也称为操作系统层)。

这样做有很多好处,例如可能更快的编译或更容易的交叉编译,但是在执行时会产生成本,而且很容易 get things wrong .


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

这不是核心设计原则,它只是一种务实的方法,并且有一些项目可以减少这些依赖性:

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

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

关于c++ - 为什么 Rust 需要 C++ 工具链来生成 Rust 二进制文件,而像 Go 这样的语言没有这个要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56161935/

相关文章:

c++ - 库使用者是否可以覆盖 C++ 异常处理?

rust - 使用 crate 的夜间版本?

rust - Rust 的词汇语法是正则的、上下文无关的还是上下文敏感的?

xml - Golang XML 解码

go os/exec 命令参数问题

testing - Golang 中的模拟函数来测试我的 http 路由

rust - 我是在移动还是克隆这个字符串

c++ - 如何更改结构指针的单个成员的值?

c++ - 带 Return 键的 Qt Tab 键顺序

c++ - std::map 不删除自定义对象的重复项