rustc 命令

介绍

​rustc:Rust 原生编译器​,类似 gcc/clang;日常开发优先用 cargo,rustc 适合底层编译、调试、理解编译链路、脚本化构建。 rustup:版本管理器;rustc:编译器;cargo:构建+包管理器。

一、基础信息

# 查看版本
rustc --version
# 帮助
rustc -h
rustc --help
# 详细长帮助
rustc --help=verbose

最简编译

新建 main.rs

fn main(){
    println!("hello rustc");
}
rustc main.rs
# Linux/macOS 输出 ./main
# Windows 输出 main.exe

✅ 注意:​rustc 只需要传入 crate 根文件(main.rs/lib.rs),不需要逐个传mod文件​,模块由 mod xxx; 在源码内部引入。

二、核心编译参数

1. 输出控制 -o / --emit

# 指定输出文件名
rustc main.rs -o hello

# --emit:输出指定产物(可多选逗号分隔)
# bin      可执行文件(默认)
# lib      rlib静态库
# obj      目标文件(.o)
# asm      汇编代码
# llvm-ir  LLVM IR
# mir      Rust MIR中间代码
# dep-info 依赖信息
rustc main.rs --emit=asm,obj
rustc main.rs --emit=llvm-ir

2. 版本edition(非常常用)

# 2015 / 2018 / 2021 / 2024
rustc main.rs --edition=2021

3. 库搜索路径 -L、链接库 -l

# -L 添加库搜索目录
# -L crate=path        找rlib crate
# -L native=path        找C静态/动态库
# -L all=path(默认)
rustc main.rs -L ./target/debug/deps

# -l 链接原生库(C库)
rustc main.rs -l m    # 链接libm数学库
rustc main.rs -l static=m # 静态链接

4. 外部crate --extern

手动链接第三方库(cargo自动处理,rustc裸编译才用)

# 格式 --extern crate_name=path/to/libxxx.rlib
rustc main.rs --extern serde=./libserde.rlib

5. 条件编译 --cfg

对应源码 #[cfg(...)]

rustc main.rs --cfg debug
rustc main.rs --cfg 'feature="foo"'

源码里:

#[cfg(debug)]
fn log(){}

6. 优化级别 -O / -C opt-level

# -O = 等价 -C opt-level=2(发布优化)
rustc main.rs -O

# 可选 0(无优化,debug) 1 2 3 s(体积优先) z(最小体积)
rustc main.rs -C opt-level=0
rustc main.rs -C opt-level=s

7. Debug信息、符号

# -g 带完整DWARF调试信息(gdb/lldb)
rustc main.rs -g
# 只生成行号,体积更小
rustc main.rs -C debuginfo=1
# debuginfo=0 关闭调试符号

8. Lint 警告控制(-A -W -D -F)

  • -A allow:允许,不提示
  • -W warn:警告(默认)
  • -D deny:禁止,变编译错误
  • -F forbid:禁止,不可覆盖
# 把未使用变量警告变成错误
rustc main.rs -D unused_variables
# 忽略 unused_imports
rustc main.rs -A unused_imports

9. 目标平台 --target(交叉编译)

# 查看所有支持target
rustc --print target-list
# 编译到windows
rustc main.rs --target x86_64-pc-windows-gnu

三、--print 系列:只打印信息,不编译

rustc --print cfg                # 打印当前cfg环境
rustc --print target-spec-json   # target详细配置
rustc --print sysroot            # rust工具链根目录
rustc --print crate-name
rustc --print link-args          # 打印传给链接器参数

四、crate类型(--crate-type)

# bin:可执行(默认带main函数)
# lib:rlib静态库
# cdylib:C兼容动态库 .so/.dll
# staticlib:纯静态库给C链接
rustc lib.rs --crate-type=cdylib
rustc lib.rs --crate-type=staticlib
# 同时输出多个类型
rustc lib.rs --crate-type=rlib,cdylib

配套:--crate-name=xxx 设置crate名字

五、代码生成参数 -C(codegen,长参数)

# 关闭栈保护
-C stack-protector=none
# 开启frame pointer(方便性能采样)
-C force-frame-pointers=yes
# 链接时优化 LTO
-C lto=thin
-C lto=fat
# panic策略
-C panic=abort   # 直接终止,不展开
-C panic=unwind  # 栈展开(默认)

六、编译阶段(rustc内部流程)

  1. 词法/语法解析 → AST
  2. 宏展开
  3. 名字解析、类型检查、借用检查(borrow checker)
  4. 生成 MIR(Rust中间表示)
  5. MIR优化 → 转LLVM IR
  6. LLVM优化 → 机器码obj
  7. 链接器ld/lld链接 → bin / lib

rustc 报错大多在​借用检查阶段​,是Rust安全核心。

七、常见实战示例

示例1:发布小体积程序(strip+优化)

rustc main.rs -O -C opt-level=z
# 再strip符号(Linux)
strip ./main

示例2:编译C动态库(给C调用)

lib.rs

#[no_mangle]
pub extern "C" fn add(a:i32,b:i32)->i32{a+b}
rustc lib.rs --crate-type=cdylib --edition=2021 -O

示例3:只编译不链接(只输出obj)

rustc main.rs --emit=obj

示例4:生成汇编看底层

rustc main.rs --emit=asm -O

八、rustc vs cargo 区别

  • rustc:单crate编译,​无依赖自动管理、无增量编译、无清单​;适合教学、底层调试、交叉脚本、简单单文件。
  • cargo:调用rustc,管理Cargo.toml、依赖、增量缓存、测试、bench、工作区;​项目开发首选​。

如果你想看:rustc 编译单文件引入外部crates(比如rand)完整可跑例子,我可以给你一整套命令。