cargo
Alexander Hou

Rust环境已经搭建好了,我们可以正式来看看“后勤保障部”:cargoCargo.toml

在 C 语言的世界里,我们经常要手工编写 MakefileCMakeLists.txt,管理 #include 路径,还要用 aptpacman 痛苦地处理第三方库的动态链接(.so)和静态链接(.a)。

而在 Rust 里,cargo 把构建系统、包管理器、测试框架、文档生成器全部揉在了一起。它就是你的 CMake + make + pacman + GDB 启动器。

cargo终端常用命令

cargo new <项目名> --bin:创建一个二进制可执行项目。

cargo new <项目名> --lib:创建一个写库(.a/.so)的项目。

cargo check:极速检查语法。 它只做语法分析和类型检查,不生成机器码。因为 Rust 的后端编译(LLVM)比较慢,写代码时用 cargo check 来看有没有报错是最快的。

cargo build:在 target/debug/ 下生成带调试符号的二进制文件。

cargo run:组合拳,先执行 cargo build,如果成功则立刻运行这个二进制。

cargo build --release:启动极致优化编译,在 target/release/ 下生成没有任何冗余、速度拉满的二进制文件。

cargo fmt:代码格式化。 强迫症的福音。不管是大括号换行还是空格,全行业统一标准,敲一下自动把整个项目排版得整整齐齐。

cargo clippy:Rust 届的“老中医”。 它是官方的静态审查工具(Linter)。它不仅能查错,还会教你做人。比如它会提示:“你这段代码虽然能跑,但写得太像 C 语言了,在 Rust 里用某个函数会更安全、更高效。”

解剖 Cargo.toml:现代化的“Makefile”

在创建一个新的Rust项目后,可以看到项目目录会出现 Cargo.tomlsrc/main.rs 文件。我们来看一看 Cargo.toml

Cargo.toml 使用的是 TOML(Tom’s Obvious, Minimal Language)语法。它主要由三个核心板块构成:

  • [package]—— 基础元数据

    定义你自己的程序信息,类似于 C 语言里你在头文件里定义的版本宏。

    1
    2
    3
    4
    [package]
    name = "hello_linux" # 项目名称,编译出来的二进制文件名就是它
    version = "0.1.0" # 项目版本号
    edition = "2024" # Rust 语言的大版本迭代(目前主流是 2021)
  • [dependencies]—— 惊艳的包管理

    如果你要用任何第三方库,直接往这一写,Cargo 自动帮你去镜像源下载、编译、链接,一行命令都不需要多敲。

    1
    2
    3
    4
    5
    6
    7
    [dependencies]
    # 基础包:直接指定版本。Cargo 会自动处理它的底层 C 依赖
    libc = "0.2"

    # 进阶包:带特性的包。Rust 的库允许“按需编译”
    # 比如 tokio(高性能异步网络库),我们只启用它的宏和多线程运行时特性
    tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
  • [profile]—— 编译器优化开关

    相当于 C 语言里的 -O0, -O2, -O3-g 编译选项。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 当你运行 cargo build 时(开发调试),应用这个配置
    [profile.dev]
    opt-level = 0 # 不优化,编译速度最快
    debug = true # 生成完整的 DWARF 调试信息(配合 gdb)

    # 当你运行 cargo build --release 时(生产发布),应用这个配置
    [profile.release]
    opt-level = 3 # 极致优化,相当于 gcc -O3
    debug = false # 剥离调试信息,减小体积

    只要编译过,项目下就会多出一个 Cargo.lock 文件。它是 cargo 自动生成的,里面精确记录了你当前项目依赖的具体版本号和哈希值。只需要知道:不要手动修改它。

概念颠覆:C 的“多文件编译” vs Cargo 的 “Crate” 树

在 C 语言中,编译的最小单元是 .c 文件(编译单元)。gcc 把每个 .c 编译成 .o,最后通过 ld 链接成二进制。你需要写复杂的 Makefile 来追踪谁依赖谁、哪个头文件变了需要重新编译。

而在 Rust 中,cargo 管理的最小编译单元叫 Crate(板条箱)。

  • 一个项目可以包含多个 .rs 文件,但在 cargo 眼里,它们共同构成了一个 Crate

  • cargo 编译时,会把整个 Crate 当作一个整体交给 rustc。这意味着 rustc 天然拥有全局视角,可以在整个 Crate 内部做极致的内联优化(Inlining)和死代码消除(Dead Code Elimination),不需要像 C 语言那样依赖复杂的 LTO(链接期优化)参数。

总结

对程序员来说,cargo 不仅仅是一个包管理器,它是一套规范了整个工业界标准的底层构建脚手架。它帮你接管了依赖的下载、链接的先后顺序、多线程并行编译的调度,让你能够把 100% 的精力,专注于如何用 Rust 写出高性能、安全的底层系统代码。