命令行参数

以下是 rustc 的命令行参数及其作用的列表。

-h/--help:获取帮助

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

--cfg:配置编译环境

此标志可以为条件编译启用或禁用各种 #[cfg] 设置。

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

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

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

此标志启用在编译时检查 crate 的条件配置,特别是它有助于配置预期的 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 属性中指定的类型。

可以使用 -l ATTR_NAME:LINK_NAME 的形式覆盖 link 属性中使用的名称,其中 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
对于不支持任何逐字修饰符的链接器(例如 link.exeld64),库名称将按原样传递。因此,此选项最可靠的跨平台使用场景是在不涉及任何链接器的情况下,例如将本地库捆绑到 rlib 中。

-verbatim 表示 rustc 要么在将库名称传递给链接器之前向其添加目标特定的前缀和后缀,要么不阻止链接器隐式添加它。
raw-dylib 类型的情况下,特别是在 Windows 上,.dll 将添加到库名称中。

此修饰符的默认值为 -verbatim

注意:即使使用 +verbatim-l:filename 语法,类似 ld 的链接器通常也不支持将绝对路径传递给库。通常,此类路径需要作为输入文件传递,而无需使用任何类似 -l 的选项,例如 ld /my/absolute/path
-Clink-arg=/my/absolute/path 可用于从稳定的 rustc 执行此操作。

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

此指令告知 rustc 要构建哪种 crate 类型。此标志接受逗号分隔的值列表,并且可以多次指定。有效的 crate 类型是

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

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

更多详细信息可以在参考的链接章节中找到。

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

此指令告知 rustc 您的 crate 的名称。

--edition:指定要使用的版本

此标志采用 201520182021 的值。默认值为 2015。有关版本的更多信息可以在版本指南中找到。

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

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

  • asm — 生成包含 crate 的汇编代码的文件。默认输出文件名为 CRATE_NAME.s
  • dep-info — 生成一个带有 Makefile 语法的 文件,该语法指示加载以生成 crate 的所有源文件。默认输出文件名为 CRATE_NAME.d
  • link — 生成由 --crate-type 指定的 crate。默认输出文件名取决于 crate 类型和平台。如果未指定 --emit,则这是默认值。
  • llvm-bc — 生成一个包含 LLVM 位码的二进制文件。默认输出文件名为 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。

只有当不是 tty 时,才能将二进制输出类型写入 stdout。文本输出类型(asmdep-infollvm-irmir)可以写入 stdout,而不管它是否是 tty。

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

--print:打印编译器信息

此标志会打印有关编译器的各种信息。此标志可以指定多次,并且信息会按照标志指定的顺序打印。指定 --print 标志通常会禁用 --emit 步骤,并且只会打印请求的信息。有效的打印值类型如下:

  • crate-name — crate 的名称。
  • file-nameslink emit 类型创建的文件名。
  • sysroot — sysroot 的路径。
  • target-libdir — 目标 libdir 的路径。
  • host-tuple — 主机编译器的目标元组字符串(例如,x86_64-unknown-linux-gnu)。
  • cfg — cfg 值的列表。有关 cfg 值的更多信息,请参阅 条件编译
  • target-list — 已知目标的列表。可以使用 --target 标志选择目标。
  • target-cpus — 当前目标可用的 CPU 值列表。可以使用 -C target-cpu=val 标志选择目标 CPU。
  • target-features — 当前目标可用的目标特性列表。可以使用 -C target-feature=val 标志启用目标特性。此标志是不安全的。有关更多详细信息,请参阅已知问题
  • relocation-models — 重定位模型列表。可以使用 -C relocation-model=val 标志选择重定位模型。
  • code-models — 代码模型列表。可以使用 -C code-model=val 标志选择代码模型。
  • tls-models — 支持的线程局部存储模型列表。可以使用 -Z tls-model=val 标志选择模型。
  • native-static-libs — 这可以在创建 staticlib crate 类型时使用。如果这是唯一的标志,它将执行完整编译,并包含一个诊断注释,指示在链接生成的静态库时要使用的链接器标志。注释以文本 native-static-libs: 开头,以便更容易获取输出。
  • link-args — 此标志不会禁用 --emit 步骤。在链接时,此标志会导致 rustc 以人类可读的形式打印完整的链接器调用。这在调试链接器选项时非常有用。此调试输出的确切格式不是稳定的保证,但它将包括链接器可执行文件和传递给链接器的每个命令行参数的文本。
  • deployment-target — 当前选择的 部署目标(或所选 Apple 平台目标的最低操作系统版本)。此值可以与需要此信息的 Rust 构建一起使用或传递给其他组件,例如 C 编译器。如果环境中不存在任何 *_DEPLOYMENT_TARGET 变量,则此值返回 rustc 支持的最低部署目标,否则返回该变量的解析值。

可以为每个请求的信息类型可选地指定一个文件路径,格式为 --print KIND=PATH,就像 --emit 一样。指定路径时,信息将写入该路径而不是标准输出。

-g: 包括调试信息

-C debuginfo=2 的同义词。

-O: 优化你的代码

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

-o: 输出文件名

此标志控制输出文件名。

--out-dir: 将输出写入的目录

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

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

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

--test: 构建测试工具

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

--target: 选择要构建的目标三元组

这控制要生成哪个 目标

-W: 设置 lint 警告

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

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

--force-warn: 强制 lint 发出警告

此标志将给定的 lint 设置为 强制警告级别,并且该级别不能被覆盖,即使忽略 lint 上限

-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。只有在 nightly 版本中才能使用 -Z 指定选项。要查看所有可用的选项,请运行: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: 控制如何生成错误

此标志允许你控制消息的格式。消息将打印到标准错误输出。有效的选项是

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

--color: 配置输出的颜色

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

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

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

此标志接受一个数字,该数字指定终端的字符宽度。诊断信息的格式将考虑宽度,以使其更好地适应屏幕。

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

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

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

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

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

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

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

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

  • diagnostic-rendered-ansi - 默认情况下,JSON blob 的 rendered 字段将包含诊断信息的纯文本渲染。此选项指示诊断信息应嵌入 ANSI 颜色代码,以便像 rustc 通常在终端输出中那样对消息进行着色。请注意,它可以与 fwdansi 等 crate 结合使用,以便将 Windows 上的这些 ANSI 代码转换为控制台命令,或者与 strip-ansi-escapes 结合使用,以便在之后选择性地删除 ANSI 颜色。

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

  • future-incompat - 包含一个 JSON 消息,如果 crate 中包含任何将来可能无法编译的代码,则该消息会包含报告。

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

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

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

如果在命令行中指定 @path,它将打开 path 并从中读取命令行选项。这些选项每行一个;空行表示一个空选项。该文件可以使用 Unix 或 Windows 样式换行符,并且必须编码为 UTF-8。