为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
浮云间 2023-06-19 15:19:01
rustc foo.rs如果我没有安装 C++ 工具链,编译 Rust 文件会失败。但是在编译 Go 程序时,不需要这样的工具链。这是为什么?
查看完整描述

1 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

因为每个人都有一个 C 工具链。

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


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

  • 您需要根据目标平台格式实现自己的链接器。

  • 您需要实现自己的 libc(又名 OS 层)。

这样做有很多好处,比如可能更快的编译或更容易的交叉编译,但是在实现时有成本,而且很容易出错


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

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

  • 使用lld而不是 ld 将允许使用可以针对所有平台的 rustc 发送单个链接器。

  • 使用cranelift作为替代后端也可以消除对 ld 的依赖。

  • Redox 项目正在开发relibc,这是 API 的可移植 Rust 实现libc

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


查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信