跳到主要内容

Rustc 编译器

Rustc 是 Rust 的官方编译器,负责将 Rust 源代码编译成可执行文件或库。了解 rustc 的使用方法对于深入理解 Rust 编译过程很有帮助。

基本用法

编译单个文件

# 编译 main.rs 生成可执行文件
rustc main.rs

# 在 Windows 上会生成 main.exe
# 在 Unix 系统上会生成 main

指定输出文件名

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

# 指定输出目录
rustc main.rs --out-dir ./build/

编译选项

优化级别

# 无优化(默认,调试模式)
rustc main.rs

# 基本优化
rustc -O main.rs
# 或者
rustc --opt-level=1 main.rs

# 更多优化(发布模式)
rustc --opt-level=2 main.rs

# 最大优化(可能增加编译时间)
rustc --opt-level=3 main.rs

# 优化大小
rustc --opt-level=s main.rs # 优化大小
rustc --opt-level=z main.rs # 激进的大小优化

调试信息

# 包含调试信息
rustc -g main.rs

# 指定调试信息级别
rustc -C debuginfo=0 main.rs # 无调试信息
rustc -C debuginfo=1 main.rs # 仅行号表
rustc -C debuginfo=2 main.rs # 完整调试信息

目标平台

# 查看支持的目标平台
rustc --print target-list

# 为特定平台编译
rustc --target x86_64-pc-windows-gnu main.rs
rustc --target aarch64-unknown-linux-gnu main.rs
rustc --target wasm32-unknown-unknown main.rs

库的编译

编译静态库

# 编译为静态库 (.rlib)
rustc --crate-type=rlib lib.rs

# 编译为系统静态库 (.a 或 .lib)
rustc --crate-type=staticlib lib.rs

编译动态库

# 编译为动态库 (.so, .dll, .dylib)
rustc --crate-type=dylib lib.rs

# 编译为 C 兼容的动态库
rustc --crate-type=cdylib lib.rs

编译可执行文件

# 编译为可执行文件(默认)
rustc --crate-type=bin main.rs

代码生成选项

代码生成参数

# 设置代码生成参数
rustc -C opt-level=3 main.rs
rustc -C target-cpu=native main.rs
rustc -C target-feature=+avx2 main.rs

# 链接时优化 (LTO)
rustc -C lto main.rs

# 设置代码模型
rustc -C code-model=large main.rs

链接选项

# 静态链接
rustc -C prefer-dynamic=no main.rs

# 动态链接
rustc -C prefer-dynamic=yes main.rs

# 链接外部库
rustc -L /path/to/libs main.rs
rustc -l mylib main.rs

宏和属性

条件编译

# 设置配置标志
rustc --cfg feature="serde" main.rs
rustc --cfg debug_assertions main.rs

# 查看预定义的配置
rustc --print cfg

示例代码

// main.rs
#[cfg(feature = "serde")]
use serde::{Serialize, Deserialize};

fn main() {
#[cfg(debug_assertions)]
println!("Debug mode");

#[cfg(not(debug_assertions))]
println!("Release mode");
}

错误和警告

控制警告级别

# 禁止所有警告
rustc -A warnings main.rs

# 将警告视为错误
rustc -D warnings main.rs

# 禁止特定警告
rustc -A unused-variables main.rs

# 允许特定警告
rustc -W unused-variables main.rs

常用 lint 选项

# 禁止死代码警告
rustc -A dead_code main.rs

# 禁止未使用变量警告
rustc -A unused_variables main.rs

# 禁止未使用导入警告
rustc -A unused_imports main.rs

输出信息

查看编译信息

# 查看版本信息
rustc --version
rustc -V

# 查看详细版本信息
rustc --version --verbose

# 查看支持的目标
rustc --print target-list

# 查看默认目标
rustc --print target-spec-json

# 查看配置信息
rustc --print cfg

编译过程信息

# 显示详细编译过程
rustc -v main.rs

# 显示时间信息
rustc -Z time-passes main.rs

# 显示内存使用
rustc -Z print-fuel main.rs

高级选项

不稳定特性

# 启用不稳定特性(需要 nightly)
rustc -Z unstable-options main.rs

# 显示帮助信息(包括不稳定选项)
rustc -Z help

代码分析

# 生成 LLVM IR
rustc --emit=llvm-ir main.rs

# 生成汇编代码
rustc --emit=asm main.rs

# 生成多种输出
rustc --emit=asm,llvm-ir,obj main.rs

环境变量

常用环境变量

# 设置 Rust 源码路径
export RUST_SRC_PATH=/path/to/rust/src

# 设置链接器
export RUSTC_LINKER=clang

# 设置默认目标
export RUST_TARGET_PATH=/path/to/targets

实际应用示例

编译一个简单项目

# 项目结构
# src/
# main.rs
# lib.rs
# utils.rs

# 编译库
rustc --crate-type=rlib src/lib.rs

# 编译主程序(链接库)
rustc -L . --extern mylib=liblib.rlib src/main.rs

交叉编译示例

# 为 Windows 编译(在 Linux 上)
rustc --target x86_64-pc-windows-gnu \
-C linker=x86_64-w64-mingw32-gcc \
main.rs

# 为 ARM 编译
rustc --target aarch64-unknown-linux-gnu \
-C linker=aarch64-linux-gnu-gcc \
main.rs

性能优化

发布版本编译

# 发布版本的推荐设置
rustc -O \
-C target-cpu=native \
-C lto \
--cfg 'feature="release"' \
main.rs

大小优化

# 最小化二进制大小
rustc -C opt-level=z \
-C lto \
-C panic=abort \
-C strip=symbols \
main.rs

与 Cargo 的关系

虽然 rustc 是底层编译器,但在实际开发中,我们通常使用 Cargo 来管理项目:

# Cargo 实际上调用 rustc
cargo build --verbose # 可以看到 rustc 命令

# 传递参数给 rustc
cargo rustc -- -C opt-level=3

# 设置环境变量影响 rustc
RUSTFLAGS="-C target-cpu=native" cargo build

理解 rustc 的工作原理有助于:

  • 调试编译问题
  • 优化编译性能
  • 理解 Cargo 的工作机制
  • 进行高级配置和定制