Compiling a Rust file with rustc foo.rs
fails if I don't have a C++ toolchain installed. But when compiling a Go program, such a toolchain is not required. Why is that?
为什么Rust要求使用C ++工具链来生成Rust二进制文件,而Go之类的语言却没有此要求?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- douguan1887 2019-05-16 10:56关注
TL;DR: Because everyone has a C toolchain.
Slight correction: rustc does not require a C++ toolchain, it only requires a C toolchain. Notably, rustc created binaries only depend on
libc
(or equivalent), not onlibstdc++
(or equivalent).
As Go demonstrated, it is possible to not require a C toolchain. You only need to re-implement its functionality:
- You need to implement your own linker, respecting the target platform format.
- You need to implement your own libc (aka OS layer).
There are advantages to doing so, such as possibly faster compilation or easier cross-compiling, however there is a cost in doing the implementation, and it's easy to get things wrong.
The Rust community preferred to put more effort into the language than in the toolchain, and therefore reusing the stock toolchain was easier. Specifically, rustc will require a platform linker (
ld
on Unix) and platform equivalent tolibc
.This is not a core design principle, it's just a pragmatic approach, and there are projects to cut down on these dependencies:
- Using lld rather than ld would allow shipping a single linker with rustc which can target all platforms.
- Using cranelift as an alternative backend could also remove the dependency on ld.
- The Redox project is working on relibc, a portable Rust implementation of the
libc
API.
Those are all work in progress, and in the meantime rustc will require a C toolchain. Furthermore, even in the foreseeable future, I would expect rustc to require a C toolchain for targets not yet covered by any Rust toolchain, just so you can use the target without waiting for some hypothetical development.
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 陆空双模式无人机飞控设置
- ¥15 sentaurus lithography
- ¥100 求抖音ck号 或者提ck教程
- ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)
- ¥20 web页面如何打开Outlook 365的全球离线通讯簿功能
- ¥15 io.jsonwebtoken.security.Keys
- ¥15 急,ubuntu安装后no caching mode page found等
- ¥15 联想交换机NE2580O/NE1064TO安装SONIC
- ¥15 防火墙的混合模式配置
- ¥15 Ubuntu不小心注销了要怎么恢复啊