Rustc 编译参数:给代码当 “金牌厨师” 的 N 个小技巧



各位码农朋友,今天咱们来唠唠 Rust 世界里的 “代码大厨”——rustc。如果说写 Rust 代码是准备食材,那 rustc 就是掌勺的厨师,而那些编译参数,就是你给厨师的 “特殊要求”:“麻烦少放辣”“多撒点芝麻”“装在那个印着小猫的盘子里”…… 理解了这些参数,你就能让厨师做出 “合口味” 的程序啦!

案例 1:-o—— 给你的程序起个正经名字

默认情况下,rustc 编译出来的程序叫啥?Linux 上是 a.out,Windows 上是 a.exe—— 这名字跟 “无名小菜” 似的,谁知道是啥菜啊!-o 参数就像告诉厨师:“这道菜叫‘红烧鲤鱼’,别用默认的‘家常菜’标签!”



步骤:



  1. 新建文件 hello.rs,写下代码:



rust

fn main() {
    println!("我不是无名小菜!");
}




  1. 编译时用 -o 指定名字:



bash

rustc hello.rs -o my_first_dish  # 告诉厨师:这菜叫 my_first_dish



  1. 运行看看:



bash

# Linux/Mac
./my_first_dish  # 输出:我不是无名小菜!

# Windows
my_first_dish.exe



类比: 就像点奶茶时备注 “杯子上写‘暴富’”,-o 让你的程序有了专属 “名字牌”。

案例 2:--edition—— 选对 “菜谱版本”

Rust 每隔几年会更新 “语言版本”(edition),就像菜谱会升级:2015 版菜谱没有 “空气炸锅做法”,2021 版才有。--edition 就是告诉厨师:“用 2021 版菜谱做,别用老版本的步骤!”



步骤:



  1. 新建 edition_demo.rs,用个 2021 版才有的特性(比如 into_iter 对数组的支持):



rust

fn main() {
    let nums = [1, 2, 3];
    // 2021版才支持数组直接 into_iter,老版本会报错
    for n in nums.into_iter() {
        println!("{}", n);
    }
}



  1. 用老版本编译试试(会报错):



bash

rustc edition_demo.rs  # 默认可能用老版本,报错:no method named `into_iter` found



  1. 指定 2021 版编译(成功):



bash

rustc edition_demo.rs --edition 2021 -o edition_ok
./edition_ok  # 输出:1 2 3



类比: 就像做蛋糕时说 “用 2023 版配方,别用 2010 版的(那时还没低糖配方)”。

案例 3:--emit—— 要 “做菜步骤记录”

有时候你想看看厨师是怎么把食材变成菜的,--emit 就像说:“麻烦把切菜、翻炒、调味的步骤写下来给我!” 可以生成汇编、LLVM 中间代码等 “过程文件”。



步骤:



  1. 还是用 hello.rs(内容同案例 1)。
  2. 编译时让厨师输出 “步骤记录”(汇编代码):



bash

rustc hello.rs --emit=asm -o hello_asm  # emit=asm 表示输出汇编代码



  1. 此时会多出一个 hello.s 文件,打开能看到类似这样的汇编代码(不同系统略有差异):



asm

    .section    .rodata
.LC0:
    .string "我不是无名小菜!"
    ...  # 一堆汇编指令



类比: 就像看菜谱时不仅要成品,还要 “备菜步骤图”“火候控制表”,方便学习或找茬。

案例 4:-g—— 给程序装个 “黑匣子”

程序出 bug 了?想调试?-g 就像给菜装个 “黑匣子”,记录烹饪过程中的每一步,方便后来查 “这菜为啥糊了”。加上 -g 会生成调试信息,配合 gdb 或 lldb 就能一步步看代码执行。



步骤:



  1. 新建 debug_demo.rs:



rust

fn main() {
    let a = 10;
    let b = 20;
    let c = a + b;
    println!("{} + {} = {}", a, b, c);
}



  1. 带调试信息编译:



bash

rustc debug_demo.rs -g -o debug_with_g  # -g 就是装“黑匣子”



  1. 用 gdb 调试(Linux/Mac):



bash

gdb ./debug_with_g
# 进入gdb后,设置断点在第4行
(gdb) break debug_demo.rs:4
# 运行程序
(gdb) run
# 此时会停在第4行,查看变量a的值
(gdb) print a  # 输出:$1 = 10
# 继续执行
(gdb) continue  # 输出:10 + 20 = 30



类比: 就像飞机的黑匣子,出问题时能倒查 “哪个环节出了错”。

案例 5:--cfg——“按需做菜”

同一个代码想根据条件编译不同内容?比如 “给南方人做甜口,给北方人做咸口”。--cfg 就像这个 “口味开关”,通过 cfg 属性控制哪些代码生效。



步骤:



  1. 新建 cfg_demo.rs:



rust

fn main() {
    #[cfg(sweet)]  // 如果指定了 sweet,就编译这段
    println!("这是甜口的程序~");

    #[cfg(salty)]  // 如果指定了 salty,就编译这段
    println!("这是咸口的程序~");
}



  1. 编译时指定 “甜口”:



bash

rustc cfg_demo.rs --cfg sweet -o sweet_dish
./sweet_dish  # 输出:这是甜口的程序~



  1. 再试试 “咸口”:



bash

rustc cfg_demo.rs --cfg salty -o salty_dish
./salty_dish  # 输出:这是咸口的程序~



类比: 就像同一份披萨面团,指定 --cfg cheese 做芝士味,--cfg pepperoni 做香肠味。

总结

rustc 的编译参数就像给 “代码厨师” 的详细备注,让你的程序从 “随便做做” 变成 “定制款”。掌握这些参数,你就能更灵活地控制编译过程,无论是起名字、选版本,还是调试、定制功能,都能游刃有余~

标题

  1. 《Rustc 编译参数:给代码当 “金牌厨师” 的 N 个小技巧》
  2. 《从 “无名小菜” 到 “定制大餐”:rustc 参数入门指南》

简介

本文用 “厨师做菜” 的趣味类比,详解 rustc 常用编译参数,通过 5 个实操案例带你掌握如何给程序起名字、选择语言版本、生成中间代码、添加调试信息和条件编译,让你轻松驾驭 Rust 编译过程。

关键词

#rustc #编译参数 #Rust 编程 #条件编译 #调试信息

原文链接:,转发请注明来源!