rust 为什么需要gcc

最后发布时间:2026-02-14 08:58:08 浏览量:

glibc 是什么?

glibc = GNU C Library

它是:

  • Linux 上最常见的 C 标准库实现

  • 提供:

    • malloc
    • printf
    • pthread
    • 文件操作
    • 系统调用封装

glibc 本质上是:

Linux 用户态程序和 Linux 内核之间的桥梁

这个问题问得非常关键 👍

❓“既然最后只生成一个可执行文件,为什么还需要 gcc?”

答案是:

✅ Rust 只负责“编译”
✅ 但“链接”阶段需要系统 C 工具链
❗ gcc 在这里不是编译 Rust,而是负责链接

我们一步步拆开。


1️⃣ Rust 编译分两个阶段

源码 (.rs)
   ↓
rustc 编译
   ↓
目标文件 (.o)
   ↓
链接 (linker)
   ↓
可执行文件 (ELF)

关键点:

👉 gcc 出现在“链接阶段”


2️⃣ rustc 实际做了什么?

当你执行:

cargo build

实际上内部类似执行:

rustc → 生成 .o 目标文件
cc/gcc → 把所有 .o + 标准库 + glibc 链接成 ELF

所以:

  • Rust 自己负责生成机器码
  • gcc 负责“把东西拼起来”

3️⃣ 为什么链接要用 gcc?

在 Linux 默认目标:

x86_64-unknown-linux-gnu

它依赖:

  • glibc(C 标准库)
  • 系统启动代码(crt1.o)
  • libc.so
  • libpthread
  • libdl

这些都属于 C 生态

而:

glibc 是用 C 写的
链接它需要 C linker

gcc 本质是:

一个编译器 + 一个 linker 驱动器

它最终调用的是:

ld

4️⃣ 举个真实例子

即使是最简单的 Rust 程序:

fn main() {
    println!("hello");
}

它内部其实会用到:

  • malloc
  • write
  • exit
  • 系统启动入口

这些都来自:

libc (glibc)

Rust 不会自己实现一套 Linux 系统库。

所以必须链接 glibc。


5️⃣ 但为什么 musl 不需要 gcc?

如果你使用:

x86_64-unknown-linux-musl

Rust 会:

  • 使用内置 musl
  • 静态链接
  • 不依赖系统 glibc

这样:

rustc + 自带 linker + musl

就能完成。

这时:

👉 不需要系统 gcc


6️⃣ 为什么只看到一个文件?

因为:

  • .o 是临时文件
  • 链接完成后会删除
  • 最终只保留 ELF 文件

就像 C:

gcc main.c

你也只看到一个文件:

a.out

但中间也生成过 .o


7️⃣ 深入一点(更底层)

在 Linux 上:

  • 程序启动必须有 _start
  • _start 在 crt1.o
  • crt1.o 来自 glibc
  • glibc 由 C 工具链管理

Rust 并没有重新发明 Linux 启动机制。


8️⃣ 一句话总结

Rust 不需要 gcc 来“编译 Rust”

但在 gnu 目标下,需要 gcc 来“链接 glibc”


9️⃣ 用一个类比理解

想象:

Rust = 做零件的工厂
gcc = 装配工厂
glibc = 标准螺丝

Rust 做出了零件(.o)

gcc 负责把:

  • Rust 零件
  • glibc 螺丝
  • 启动代码

组装成完整机器。


如果你愿意,我可以再讲一个更底层的问题:

为什么 Linux 世界“几乎所有语言”最终都依赖 glibc?

理解这个,你会彻底看透 Linux 程序运行机制。