命令行参数

下面列出了 rustc 的命令行参数及其作用。

-h/--help:获取帮助

此标志将打印 rustc 的帮助信息。

--cfg:配置编译环境

此标志可以开启或关闭各种 #[cfg] 设置,用于条件编译

值可以是单个标识符,也可以是两个由 = 分隔的标识符。

例如,--cfg 'verbose'--cfg 'feature="serde"'。它们分别对应于 #[cfg(verbose)]#[cfg(feature = "serde")]

--check-cfg:配置条件编译的编译时检查

此标志允许在编译时检查 crate 的条件配置,特别是它有助于配置预期的 cfg 名称和值集,以检查每个“可达的” #[cfg] 是否与预期的配置名称和值匹配。

这与上面的 --cfg 标志不同,--cfg 只是激活一些配置,但并不期望它们存在。这有助于防止条件停滞、输入错误等。

有关更多详细信息和解释,请参阅本书的检查条件配置章节。

例如,--check-cfg 'cfg(verbose)'--check-cfg 'cfg(feature, values("serde"))'。它们分别对应于 #[cfg(verbose)]#[cfg(feature = "serde")]

-L:将目录添加到库搜索路径

-L 标志添加了一个搜索外部 crate 和库的路径。

搜索路径的类型可以可选地通过 -L KIND=PATH 形式指定,其中 KIND 可以是以下之一:

  • dependency — 仅在此目录中搜索传递依赖项。
  • crate — 仅在此目录中搜索此 crate 的直接依赖项。
  • native — 仅在此目录中搜索原生库。
  • framework — 仅在此目录中搜索 macOS 框架。
  • all — 在此目录中搜索除框架以外的所有库类型。如果未指定 KIND,这是默认值。

语法:-l [KIND[:MODIFIERS]=]NAME[:RENAME]

此标志允许您在构建 crate 时指定链接到特定的原生库。

库的类型可以可选地通过 -l KIND=lib 形式指定,其中 KIND 可以是以下之一:

  • dylib — 原生动态库。
  • static — 原生静态库(例如 .a 归档)。
  • framework — macOS 框架。

如果指定了类型,则可以附加链接修饰符。修饰符指定为一个逗号分隔的字符串,每个修饰符都带有 +- 前缀,分别表示修饰符已启用或已禁用。目前不支持在单个 link 属性中指定多个 modifiers 参数,或在同一个 modifiers 参数中指定多个相同的修饰符。
示例:-l static:+whole-archive=mylib

库的类型和修饰符也可以在#[link] 属性中指定。如果在 link 属性或命令行中未指定类型,则默认链接动态库,但在构建静态可执行文件时除外。如果在命令行中指定了类型,它将覆盖 link 属性中指定的类型。

link 属性中使用的名称可以使用 -l ATTR_NAME:LINK_NAME 形式覆盖,其中 ATTR_NAMElink 属性中的名称,而 LINK_NAME 是实际链接的库的名称。

链接修饰符:whole-archive

此修饰符仅与 static 链接类型兼容。使用任何其他类型将导致编译器错误。

+whole-archive 意味着静态库将作为整个归档链接,不会丢弃任何目标文件。

此修饰符对于类 ld 链接器转换为 --whole-archive,对于 link.exe 转换为 /WHOLEARCHIVE,对于 ld64 转换为 -force_load。对于不支持此修饰符的链接器,此修饰符无效。

此修饰符的默认值为 -whole-archive

链接修饰符:bundle

此修饰符仅与 static 链接类型兼容。使用任何其他类型将导致编译器错误。

在构建 rlib 或 staticlib 时,+bundle 意味着原生静态库将被打包到 rlib 或 staticlib 归档中,然后在最终二进制文件的链接阶段从中检索。

在构建 rlib 时,-bundle 意味着原生静态库作为该 rlib 的依赖项“按名称”注册,其目标文件仅在最终二进制文件的链接阶段包含,文件搜索也是在此阶段进行的。
在构建 staticlib 时,-bundle 意味着原生静态库根本不包含在归档中,而需要一些更高级别的构建系统在最终二进制文件的链接阶段稍后添加它。

在构建可执行文件或动态库等其他目标时,此修饰符无效。

此修饰符的默认值为 +bundle

链接修饰符:verbatim

此修饰符与所有链接类型兼容。

+verbatim 意味着 rustc 本身不会向库名称添加任何特定于目标的库前缀或后缀(如 lib.a),并将尽最大努力要求链接器执行同样的操作。

对于支持 GNU 扩展的类 ld 链接器,rustc 在传递库时将使用 -l:filename 语法(注意冒号),因此链接器不会向其添加任何前缀或后缀。有关更多详细信息,请参阅 ld 文档中的-l namespec
对于不支持任何 verbatim 修饰符的链接器(例如 link.exeld64),库名称将原样传递。因此,此选项最可靠的跨平台使用场景是不涉及链接器的情况,例如将原生库打包到 rlib 中。

-verbatim 意味着 rustc 在将库名称传递给链接器之前会添加一个特定于目标的前缀和后缀,或者不会阻止链接器隐式添加它们。
特别是对于 raw-dylib 类型,在 Windows 上会向库名称添加 .dll

此修饰符的默认值为 -verbatim

注意:即使使用 +verbatim-l:filename 语法,类 ld 链接器通常也不支持将绝对路径传递给库。通常需要将此类路径作为输入文件传递,而不使用任何选项(如 -l),例如 ld /my/absolute/path
对于 stable 版本的 rustc,可以使用 -Clink-arg=/my/absolute/path 来实现这一点。

--crate-type:编译器要输出的 crate 类型列表

这指示 rustc 构建哪种 crate 类型。此标志接受逗号分隔的值列表,可以指定多次。有效的 crate 类型是:

  • lib — 生成编译器首选的库类型,目前默认为 rlib
  • rlib — Rust 静态库。
  • staticlib — 原生静态库。
  • dylib — Rust 动态库。
  • cdylib — 原生动态库。
  • bin — 可执行程序。
  • proc-macro — 生成适合可由编译器加载的过程宏库的格式。

crate 类型可以使用crate_type 属性指定。--crate-type 命令行值将覆盖 crate_type 属性。

更多详细信息请参见参考手册的链接章节

--crate-name:指定正在构建的 crate 的名称

这通知 rustc 您的 crate 的名称。

--edition:指定要使用的 edition

此标志接受 2015201820212024 的值。默认值为 2015。有关 edition 的更多信息,请参见edition 指南

--emit:指定要生成的输出文件类型

此标志控制编译器生成的输出文件类型。它接受逗号分隔的值列表,可以指定多次。有效的输出类型是:

  • asm — 生成包含 crate 汇编代码的文件。默认输出文件名为 CRATE_NAME.s
  • dep-info — 生成一个包含 Makefile 语法的文件,指示生成 crate 所加载的所有源文件。默认输出文件名为 CRATE_NAME.d
  • link — 生成 --crate-type 指定的 crate。默认输出文件名取决于 crate 类型和平台。如果未指定 --emit,这是默认值。
  • llvm-bc — 生成包含LLVM bitcode 的二进制文件。默认输出文件名为 CRATE_NAME.bc
  • llvm-ir — 生成包含LLVM IR 的文件。默认输出文件名为 CRATE_NAME.ll
  • metadata — 生成一个包含 crate 元数据的文件。默认输出文件名为 libCRATE_NAME.rmeta
  • mir — 生成一个包含 rustc 中级中间表示的文件。默认输出文件名为 CRATE_NAME.mir
  • obj — 生成原生目标文件。默认输出文件名为 CRATE_NAME.o

输出文件名可以使用-o 标志设置。可以使用-C extra-filename 标志向文件名添加后缀。

除非使用--out-dir 标志,否则输出文件将写入当前目录。

单个输出类型的自定义路径

每个输出类型都可以可选地后跟 = 来指定一个显式输出路径,该路径仅适用于该类型的输出。例如:

  • --emit=link,dep-info=/path/to/dep-info.d
    • 正常输出 crate 本身,并将依赖信息输出到指定路径。
  • --emit=llvm-ir=-,mir
    • 将 MIR 输出到默认文件名(基于 crate 名称),并将 LLVM IR 输出到 stdout。

输出到 stdout

使用 --emit-o 时,可以通过将路径指定为 -(例如 -o -)将输出发送到 stdout。

二进制输出类型只能在 stdout 不是 tty 时写入 stdout。文本输出类型(asmdep-infollvm-irmir)无论是否为 tty 都可以写入 stdout。

只能将一种输出类型写入 stdout。尝试同时将多种类型写入 stdout 将导致错误。

--print:打印编译器信息

此标志允许您设置打印选项

-g:包含调试信息

-C debuginfo=2 的同义词。

-O:优化代码

-C opt-level=3 的同义词。

-o:输出文件名

此标志控制输出文件名。

--out-dir:输出文件写入的目录

输出的 crate 将写入此目录。如果使用了-o 标志,则此标志将被忽略。

--explain:提供错误消息的详细解释

rustc 的每个错误都有一个错误码;此标志将打印出给定错误的更长解释。

--test:构建测试工具

编译此 crate 时,rustc 将忽略您的 main 函数,而是生成一个测试工具。有关测试的更多信息,请参见测试章节

--target:选择要构建的目标 triple

这控制生成哪个目标

-W:设置 lint 警告

此标志将设置哪些 lint 应设置为警告级别

注意: 这些 lint 级别参数的顺序是会被考虑的,有关更多信息,请参阅通过编译器标志设置 lint 级别

--force-warn:强制 lint 警告

此标志将给定的 lint 设置为强制警告级别,并且该级别不能被覆盖,甚至会忽略lint caps

-A:设置 lint 允许

此标志将设置哪些 lint 应设置为允许级别

注意: 这些 lint 级别参数的顺序是会被考虑的,有关更多信息,请参阅通过编译器标志设置 lint 级别

-D:设置 lint 拒绝

此标志将设置哪些 lint 应设置为拒绝级别

注意: 这些 lint 级别参数的顺序是会被考虑的,有关更多信息,请参阅通过编译器标志设置 lint 级别

-F:设置 lint 禁止

此标志将设置哪些 lint 应设置为禁止级别

注意: 这些 lint 级别参数的顺序是会被考虑的,有关更多信息,请参阅通过编译器标志设置 lint 级别

-Z:设置不稳定选项

此标志允许您设置 rustc 的不稳定选项。要设置多个选项,可以多次使用 -Z 标志。例如:rustc -Z verbose-internals -Z time-passes。使用 -Z 指定选项仅在 nightly 版本中可用。要查看所有可用选项,请运行:rustc -Z help,或参阅不稳定手册

--cap-lints:设置最严格的 lint 级别

此标志允许您“限制”lint 级别,更多信息,请参见此处

-C/--codegen:代码生成选项

此标志允许您设置代码生成选项

-V/--version:打印版本信息

此标志将打印 rustc 的版本信息。

-v/--verbose:使用详细输出

此标志与其他标志结合使用时,会使它们产生额外的输出。

--extern:指定外部库的位置

此标志允许您传递直接依赖项的外部 crate 的名称和位置。间接依赖项(依赖项的依赖项)使用-L 标志查找。给定的 crate 名称将添加到extern prelude 中,类似于在根模块中指定 extern crate。给定的 crate 名称无需与构建该库时使用的名称匹配。

指定 --externextern crate 有一个行为差异:--extern 仅仅使 crate 成为链接的“候选者”;除非实际使用,否则它不会真正链接。在极少数情况下,即使您不主动在代码中使用某个 crate,您也可能希望确保它被链接:例如,如果它更改了全局分配器,或者它包含供其他编程语言使用的 #[no_mangle] 符号。在这种情况下,您需要使用 extern crate

此标志可以指定多次。此标志接受以下任一格式的参数:

  • CRATENAME=PATH — 指示给定的 crate 在给定的路径下找到。
  • CRATENAME — 指示给定的 crate 可以在搜索路径中找到,例如在 sysroot 中或通过 -L 标志。

同一个 crate 名称可以针对不同的 crate 类型多次指定。如果找到 rlibdylib,则使用内部算法决定链接时使用哪一个。-C prefer-dynamic 标志可用于影响使用哪一个。

如果同一个 crate 名称指定了路径和未指定路径,则使用带有路径的那个,不带路径的标志无效。

--sysroot:覆盖系统根目录

“sysroot”是 rustc 查找 Rust 发行版附带的 crate 的位置;此标志允许覆盖该位置。

--error-format:控制错误的生成方式

此标志允许您控制消息的格式。消息将打印到 stderr。有效选项是:

  • human — 人类可读的输出。这是默认值。
  • json — 结构化 JSON 输出。有关更多详细信息,请参见JSON 章节
  • short — 简短的单行消息。

--color:配置输出颜色

此标志允许您控制输出的颜色设置。有效选项是:

  • auto — 如果输出到 tty,则使用颜色。这是默认值。
  • always — 始终使用颜色。
  • never — 永不为输出着色。

--diagnostic-width:指定诊断信息的终端宽度

此标志接受一个数字,用于指定终端的宽度(以字符为单位)。诊断信息的格式化将考虑该宽度,使其更适合屏幕显示。

--remap-path-prefix:重新映射输出中的源名称

重新映射所有输出中的源路径前缀,包括编译器诊断信息、调试信息、宏展开等。它接受 FROM=TO 形式的值,其中等于 FROM 的路径前缀被重写为 TO 值。FROM 本身可能包含 = 符号,但 TO 值不能。此标志可以指定多次。

这对于规范化构建产物很有用,例如从输出到目标文件中的路径名中移除当前目录。替换是纯文本的,不考虑当前系统的路径名语法。例如,--remap-path-prefix foo=bar 将匹配 foo/lib.rs,但不匹配 ./foo/lib.rs

当给出多个重新映射并且其中几个匹配时,应用最后一个匹配的。

--json:配置编译器打印的 json 消息

当向 rustc 传递--error-format=json 选项时,所有编译器的诊断输出都将以 JSON blobs 的形式发出。--json 参数可以与 --error-format=json 结合使用,以配置 JSON blobs 包含的内容以及发出哪些 JSON blobs。

使用 --error-format=json 时,编译器将始终将任何编译器错误作为 JSON blob 发出,但 --json 标志还提供以下选项来自定义输出:

  • diagnostic-short - 诊断消息的 json blobs 应使用“short”渲染而不是正常的“human”默认渲染。这意味着 --error-format=short 的输出将嵌入到 JSON 诊断中,而不是默认的 --error-format=human

  • diagnostic-rendered-ansi - 默认情况下,JSON blobs 在其 rendered 字段中包含诊断信息的纯文本渲染。此选项指示诊断信息应包含嵌入的 ANSI 颜色代码,这些代码旨在以 rustc 通常为终端输出着色的方式为消息着色。请注意,此选项可以有效地与 fwdansi 等 crate 结合使用,在 Windows 上将这些 ANSI 代码转换为控制台命令,或者与 strip-ansi-escapes 结合使用,如果您希望之后可选地移除 ansi 颜色。

  • artifacts - 这指示 rustc 为每个发出的 artifact 发出一个 JSON blob。artifact 对应于来自--emit CLI 参数的请求,一旦 artifact 在文件系统上可用,就会发出通知。

  • future-incompat - 包含一个 JSON 消息,报告 crate 中是否包含将来可能编译失败的任何代码。

请注意,将 --json 参数与--color 参数结合使用是无效的,并且必须将 --json--error-format=json 结合使用。

有关更多详细信息,请参见JSON 章节

@path:从路径加载命令行标志

如果您在命令行上指定 @path,它将打开 path 并从中读取命令行选项。这些选项每行一个;空行表示空选项。文件可以使用 Unix 或 Windows 风格的行结尾,并且必须以 UTF-8 编码。