Rust的核心工具包括:
rustc:Rust的底层编译器。cargo最终会调用rustc来编译代码。rustc接受大量的命令行参数来精确控制编译过程。cargo:Rust 的官方构建工具和包管理器。根据Cargo.toml的配置,自动调用rustc并传递合适的参数。
cargo工具
cargo是 Rust 开发的核心工具,统一了「项目创建、编译、运行、测试、依赖管理、发布」等全流程:
- 项目脚手架:创建标准 Rust 项目(二进制 / 库);
- 依赖管理:下载、更新、编译依赖(从 crates.io 或自定义源);
- 构建与运行:调用
rustc编译项目,自动处理链接、优化参数; - 测试与基准:运行单元测试、集成测试、性能基准测试;
- 发布与分发:将库发布到 crates.io,或生成可分发的二进制文件。
通过cargo创建的项目,会包含:
- Cargo.toml:「清单文件」,记录项目名称、版本、依赖、编译配置等;可手动编辑;
- Cargo.lock:「版本锁文件」,精确记录所有依赖的具体版本(确保多人协作 / 跨环境编译一致性);自动生成。
常用命令
常用命令列表
| 功能类别 | 命令 | 说明 |
|---|---|---|
| 项目创建 | cargo new <name> |
创建一个新的二进制项目 --no-git 不初始化git |
cargo new --lib <name> |
创建一个新的库项目 | |
cargo init |
在当前目录初始化一个 Cargo 项目 | |
| 编译构建 | cargo build |
编译项目(开发模式),生成到 target/debug/ 下 |
cargo build --release |
编译项目(发布模式),生成 到target/release/下 |
|
cargo check |
快速检查代码是否有编译错误,不生成可执行文件,速度最快 | |
cargo check --release |
在发布模式下快速检查代码 | |
| 运行程序 | cargo run |
以开发模式编译并运行项目 |
cargo run --release |
以发布模式编译并运行项目 | |
cargo run -- <args> |
带命令行参数(--后的内容)方式运行 |
|
| 测试 | cargo test |
编译并运行项目中的所有测试。 |
cargo test <name> |
运行名称中包含 <name> 的特定测试。 |
|
cargo test -- --nocapture |
运行测试时,显示 println!等输出信息。 |
|
cargo test -- --ignored |
运行被 #[ignore]标记的(通常被忽略的)测试 |
|
| 文档 | cargo doc |
为项目生成 HTML 文档 |
cargo doc --open |
生成文档并在浏览器中打开 | |
| 依赖管理 | cargo add <crate> |
向 Cargo.toml 添加一个依赖; --features添加包属性 |
cargo update |
更新 Cargo.lock,将依赖升级到允许的最新版本 |
|
cargo search <keyword> |
在 crates.io 上搜索包 | |
| 发布 | cargo publish |
将库发布到 crates.io |
| 清理 | cargo clean |
删除 target/目录,清除所有编译产物和缓存 |
| 代码质量 | cargo fmt |
(需安装 rustfmt) 格式化代码,使其符合 Rust 风格指南 |
cargo clippy |
(需安装 clippy) 运行 lint 工具,发现代码中的 bug、错误和不良模式。 |
cargo add reqwest --features blocking,会在toml中添加:
rust
[dependencies]
reqwest = { version = "0.12.24", features = ["blocking"] }
Profile
Cargo 的 profile 是 编译规则的集合,核心作用是将「优化等级、调试信息、编译速度、链接策略」等配置按「场景」(开发、测试、发布等)归类,避免每次编译都手动传递大量参数。
- 统一管理编译配置:将分散的
rustc参数(如优化等级、LTO)整合为场景化配置; - 优先级明确:命令行参数(如
--release)>Cargo.toml配置 > 默认值; - 继承机制:部分默认 profile 会继承其他 profile 的配置。
test←dev:修改dev的配置会影响test(除非单独覆盖test的字段);bench←release:修改release的配置会影响bench(除非单独覆盖bench的字段);
配置项
在 Cargo.toml 中为不同的 profile 可设置以下参数
opt-level (优化级别)
影响程序性能最关键的选项,直接控制 rustc 的优化级别:
- 值类型: 字符串 (
"0","1","2","3","s","z") 或整数 (0, 1, 2, 3)。 - 含义:
"0": 无优化。编译最快,但性能最差;dev的默认值。"1": 启用基本的优化。"2": 启用更多优化,是性能和编译时间的良好平衡。"3": 最高级别的优化。启用所有可用的优化,显著提升性能,但编译时间很长。release的默认值。"s": 在"2"的基础上,优先减小代码大小 (size)。适用于对二进制体积敏感的场景。"z": 在"s"的基础上,进行更激进的大小优化,追求最小的代码体积。通常比"s"编译更慢。
debug
控制是否为目标文件生成调试信息:
- 值类型: 布尔值 (
true/false) 或整数 (0, 1, 2)。 - 含义:
true/1: 生成基础的调试信息(如行号),足以支持gdb/lldb等调试器的基本操作。2: 生成完整的调试信息,支持更复杂的调试功能。false/0: 不生成任何调试信息;会使二进制文件更小,但将无法使用调试器或从崩溃中获取有意义的回溯(backtrace)。
lto (Link-Time Optimization, 链接时优化)
一个强大的全局优化技术。允许编译器在链接阶段进行跨 crate 的深度优化(如函数内联、死代码消除):
- 值类型: 字符串 (
"off","on","fat","thin","thin-local") 或布尔值。 - 含义:
"off"/false: 禁用 LTO;默认值。"on"/"fat"/true: 全量 LTO (Fat LTO)。效果最好,能产生最高效的代码,但链接时间非常长,内存消耗巨大。"thin": 薄 LTO (Thin LTO)。旨在提供接近 Fat LTO 的性能收益,同时显著减少链接时间和内存占用。是追求高性能时的推荐选择。"thin-local": Thin LTO 的一个变种,只在当前 crate 内部进行优化。
codegen-units
控制并行代码生成的单元数量;会影响编译速度和最终的优化程度:
- 值类型: 正整数。
- 含义:
- 数值越大(如
16,256):编译可以更好地并行化,编译速度更快,但限制了跨单元的优化。 - 数值越小(理想是
1):编译器能看到更多的上下文,有利于 LTO 发挥最大效果,生成更优的代码,但编译速度变慢。
- 数值越大(如
- 默认:
16(对于dev),16(对于release,但在启用 LTO 时建议设为1)。
panic
指定当 panic! 宏被触发时,程序的行为。
- 值类型: 字符串 (
"unwind","abort")。 - 含义:
"unwind": 栈展开 (Stack Unwinding)。程序会沿着调用栈向上清理(执行析构函数),然后终止。默认值。"abort": 立即终止 (Abort)。程序直接终止,不执行任何析构函数。生成的代码更小、性能略好,但资源(如文件句柄、内存)可能不会被正确释放。
strip(信息剥离)
控制移除哪些调试和符号信息:
"none":保留所有信息;默认。"debuginfo":移除调试信息"symbols":移除符号表但保留必要的调试信息"all":移除所有可选信息,包括调试和符号数据
incremental
控制是否启用增量编译。
- 值类型: 布尔值 (
true/false)。 - 含义:
true: 启用增量编译。cargo会缓存部分编译结果,当下次编译只有少量文件改变时,可以极大加快编译速度。false: 禁用增量编译。每次都是从头开始编译,速度慢,但结果更确定。
overflow-checks
控制是否在运行时检查整数运算的溢出
- 值类型: 布尔值 (
true/false)。 - 含义:
true: 启用溢出检查。如果发生溢出(如u32::MAX + 1),程序会 panic。这增加了安全性,但有轻微的性能开销。false: 禁用溢出检查。溢出时会进行"环绕"(wrap around),例如u8::MAX + 1会变成0。性能更好,但可能引入安全漏洞。
自定义
除默认的 5 个 profile,还可以创建自定义 profile(如 staging 预发布环境、min-size 极致体积环境),满足特殊需求。
通过--profile 在命令指定要使用的profile:
cargo build --profile staging
toml
# 自定义预发布环境(staging):介于 dev 和 release 之间
[profile.staging]
# 继承 release 的基础配置(可选,减少重复)
inherits = "release"
# 覆盖继承的配置:中级优化,保留基础调试信息
opt-level = 2
debug = 1
# 启用瘦 LTO,平衡性能与编译速度
lto = "thin"
# 启用增量编译(预发布环境可能频繁编译)
incremental = true
[profile.tiny]
inherits = "release"
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"
strip = "symbols"
[profile.fast]
inherits = "release"
opt-level = 3
lto = "fat"
codegen-units = 1
panic = "abort"
rustc编译器
rustc 是 Rust 的底层编译器,Cargo 的编译逻辑最终都会转化为 rustc 命令与参数(可通过 cargo build -v 查看实际调用的 rustc 命令)。
核心编译参数
| 参数 | 功能描述 | 示例 |
|---|---|---|
-o <out-name> |
指定输出文件名(默认生成与 crate 名相同) | rustc src/main.rs -o target/my_app.exe |
--crate-type <type> |
指定输出类型(默认bin): + lib/rlib:Rust 静态库 + staticlib:原生静态库 + dylib:Rust 动态库。 + cdylib:原生动态库。 + bin:可执行程序。 + proc-macro:适合由编译器加载的过程宏库 |
rustc src/lib.rs --crate-type lib |
--edition <2018/2021/2024> |
指定 Rust 版本(默认跟随 Cargo.toml 的 edition) |
rustc src/main.rs --edition 2021 |
--extern <name>=<path> |
关联外部依赖 | rustc src/main.rs --extern serde=./target/debug/deps/libserde.rlib |
-L <dir> |
添加库搜索路径(让编译器找到依赖库或系统库) | rustc src/main.rs -L ./target/debug/deps |
--print <item> |
打印编译器信息(如目标平台、配置宏) | rustc --print target-list |
优化参数(核心重点)
与 Cargo Profile 的 opt-level、lto 等字段一一对应,是控制运行性能、二进制体积的底层参数。
| 参数 | 功能描述 | Profile 字段 | 示例 |
|---|---|---|---|
-O0/-O1/-O2/-O3/-Os/-Oz -C opt-level=<0-3/s/z> |
优化等级 | opt-level |
rustc src/main.rs -O3 |
-C inline-threshold=<n> |
调整函数内联阈值(值越大越多函数被内联,默认 225) | - | rustc src/main.rs -C inline-threshold=300 |
-C lto/-C lto=thin |
启用链接时优化 | lto |
rustc src/main.rs -O3 -C lto=thin |
-C codegen-units=<n> |
指定代码生成单元(平衡编译速度与优化效果,默认 dev=16、release=1) |
codegen-units |
rustc src/main.rs -C codegen-units=4 |
-C target-cpu=<cpu> |
针对特定 CPU 架构优化(native= 自动适配本地 CPU) |
rustflags = ["-C target-cpu=native"] |
rustc src/main.rs``target-cpu=aarch64 |
调试信息与符号参数
控制二进制文件的调试信息(供 gdb/lldb 调试)和符号剥离,影响文件体积。
| 参数 | 功能描述 | Profile 字段 | 示例 |
|---|---|---|---|
-g/-g1/-g2/-g3 |
启用调试信息(-g 等价于 -g2) |
debug |
rustc src/main.rs -g |
-C debuginfo=<0-3> |
与 -g 等价,显式指定调试级别(0 = 无,1 = 基础,2 = 完整,3 = 额外) |
debug |
rustc src/main.rs -C debuginfo=1 |
-C debuginfo-format=<fmt> |
指定调试信息格式 rustc=Rust 专用, llvm=LLVM 格式, gdb= 兼容 GDB |
- | rustc src/main.rs -g -C debuginfo-format=gdb |
-C strip=<none/debuginfo/symbols> |
剥离符号信息(debuginfo= 仅剥离调试信息,symbols= 剥离所有符号) |
strip |
rustc src/main.rs -O3 -C strip=debuginfo |
目标平台与交叉编译参数
控制编译的目标平台(架构 / 操作系统),用于交叉编译场景,与 Cargo 的 --target 对应。
| 参数 | 功能描述 | 示例 |
|---|---|---|
--target <triple> |
指定目标平台三元组(如 aarch64-unknown-linux-musl) |
rustc src/main.rs --target aarch64-unknown-linux-musl (交叉编译到 ARM Linux) |
--print target-triple |
打印当前平台的目标三元组(确认编译环境) | rustc --print target-triple #x86_64-unknown-linux-gnu |
--print target-spec-json |
打印目标平台的详细配置(JSON 格式,用于自定义目标) | rustc --target aarch64-unknown-linux-musl --print target-spec-json |
-C linker=<linker> |
指定链接器(交叉编译时需配置目标平台的链接器) | rustc src/main.rs --target aarch64-unknown-linux-musl -C linker=aarch64-linux-musl-gcc |
链接参数(关联系统库 / 自定义链接逻辑)
用于链接系统库(如 libc、openssl)或传递参数给链接器(如 ld、clang)。
| 参数 | 功能描述 | 示例 |
|---|---|---|
-l <lib> |
链接系统库(省略前缀 lib 和后缀,如 libm 写作 m) |
rustc src/main.rs -l m``-l ssl |
-L <dir> |
添加库搜索路径(让链接器找到系统库或自定义库) | rustc src/main.rs -L /usr/local/lib -l redis |
-C link-arg=<arg> |
传递参数给链接器(如 ld 的 -s 剥离符号、-static 静态链接) |
rustc src/main.rs -C link-arg=-s``-C link-arg=-static |
-C link-mode=<static/dynamic> |
指定链接模式(静态 / 动态,默认自动) | rustc src/main.rs -C link-mode=static |
代码生成与安全参数
更精细的代码生成控制,包括 panic 策略、栈大小、安全检查等。
| 参数 | 功能描述 | Profile 字段 | 示例 |
|---|---|---|---|
-C panic=<unwind/abort> |
指定 panic 策略(unwind= 展开栈,abort= 直接终止) |
panic |
rustc src/main.rs -C panic=abort |
-C incremental=<true/false> |
启用 / 禁用增量编译(默认 dev=true、release=false) |
incremental |
rustc src/main.rs -C incremental=false |
-C stack-size=<size> |
指定主线程栈大小(如 8MB、16384 字节) |
- | rustc src/main.rs -C stack-size=8388608 |
-C fstack-protector=<all/strong/none> |
启用栈保护(防止栈溢出攻击,默认 none) |
- | rustc src/main.rs -C fstack-protector=strong |
-C debug-assertions=<true/false> |
启用 / 禁用调试断言(debug_assert!) |
debug-assertions |
rustc src/main.rs -C debug-assertions=false |