介绍
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内部流程)
- 词法/语法解析 → AST
- 宏展开
- 名字解析、类型检查、借用检查(borrow checker)
- 生成 MIR(Rust中间表示)
- MIR优化 → 转LLVM IR
- LLVM优化 → 机器码obj
- 链接器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)完整可跑例子,我可以给你一整套命令。