本章将介绍Rust编译器的参数。
Rust编译器程序的名字是rustc
,使用它的方法很简单:
$ rustc [OPTIONS] INPUT
其中,[OPTIONS]
表示编译参数,而INPUT
则表示输入文件。而编译参数有以下可选:
-
-h, --help
- 输出帮助信息到标准输出; -
--cfg SPEC
- 传入自定义的条件编译参数,使用方法如fn main() { if cfg!(hello) { println!("world!"); } }
如上例所示,若
cfg!(hello)
成立,则运行程序就会输出"world"
到标准输出。我们把这个文件保存为hello.rs
然后编译它$ rustc --cfg hello hello.rs
运行它就会看到屏幕中输出了
world!
。 -
-L [KIND=]PATH
- 往链接路径中加入一个文件夹,并且可以指定这个路径的类型(Kind),这些类型包括dependency
- 在这个路径下找依赖的文件,比如说mod
;crate
- 只在这个路径下找extern crate
中定义的库;native
- 只在这个路径下找Native库;framework
- 只在OS X下有用,只在这个路径下找Framework;all
- 默认选项。
-
-l [KIND=]NAME
- 链接一个库,这个库可以指定类型(Kind)static
- 静态库;dylib
- 动态库;framework
- OS X的Framework。
如果不传,默认为
dylib
。此处举一个例子如何手动链接一个库,我们先创建一个文件叫
myhello.rs
,在里面写一个函数// myhello.rs /// 这个函数仅仅向标签输出打印 Hello World! /// 不要忘记要把它标记为 pub 哦。 pub fn print_hello() { println!("Hello World!"); }
然后把这个文件编译成一个静态库,
libmyhello.a
$ rustc --crate-type staticlib myhello.rs
然后再创建一个
main.rs
,链接这个库并打印出"Hello World!"// main.rs // 指定链接库 myhello extern crate myhello; fn main() { // 调用库函数 myhello::print_hello(); }
编译
main.rs
$ rustc -L. -lmyhello main.rs
运行
main
,就会看到屏幕输出"Hello World!"啦。 -
--crate-type
- 指定编译输出类型,它的参数包括bin
- 二进行可执行文件lib
- 编译为库rlib
- Rust库dylib
- 动态链接库staticlib
- 静态链接库
-
--crate-name
- 指定这个Crate的名字,默认是文件名,如main.rs
编译成可执行文件时默认是main
,但你可以指定它为foo
$ rustc --crate-name foo main.rs
则会输出
foo
可执行文件。 -
--emit
- 指定编译器的输出。编译器默认是输出一个可执行文件或库文件,但你可以选择输出一些其它的东西用于Debugasm
- 输出汇编llvm-bc
- LLVM Bitcode;llvm-ir
- LLVM IR,即LLVM中间码(LLVM Intermediate Representation);obj
- Object File(就是*.o
文件);link
- 这个是要结合其它--emit
参数使用,会执行Linker再输出结果;dep-info
- 文件依赖关系(Debug用,类似于Makefile一样的依赖)。
以上参数可以同时使用,使用逗号分割,如
$ rustc --emit asm,llvm-ir,obj main.rs
同时,在最后可以加一个
=PATH
来指定输出到一个特定文件,如$ rustc --emit asm=output.S,llvm-ir=output.ir main.rs
这样会把汇编生成到
output.S
文件中,把LLVM中间码输出到output.ir
中。 -
--print
- 打印一些信息,参数有crate-name
- 编译目标名;file-names
- 编译的文件名;sysroot
- 打印Rust工具链的根目录地址。
-
-g
- 在目标文件中保存符号,这个参数等同于-C debuginfo=2
。 -
-O
- 开启优化,这个参数等同于-C opt-level=2
。 -
-o FILENAME
- 指定输出文件名,同样适用于--emit
的输出。 -
--out-dir DIR
- 指定输出的文件夹,默认是当前文件夹,且会忽略-o
配置。 -
--explain OPT
- 解释某一个编译错误,比如若你写了一个
main.rs
,使用了一个未定义变量f
fn main() { f }
编译它时编译器会报错:
main.rs:2:5: 2:6 error: unresolved name `f` [E0425] main.rs:2 f ^ main.rs:2:5: 2:6 help: run `rustc --explain E0425` to see a detailed explanation error: aborting due to previous error
虽然错误已经很明显,但是你也可以让编译器解释一下,什么是
E0425
错误:$ rustc --explain E0425 // 编译器打印的说明
-
--test
- 编译成一个单元测试可执行文件 -
--target TRIPLE
- 指定目标平台,基本格式是cpu-manufacturer-kernel[-os]
,例如## 64位OS X $ rustc --target x86_64-apple-darwin
-
-W help
- 打印Linter的所有可配置选项和默认值。 -
-W OPT, --warn OPT
- 设置某一个Linter选项为Warning。 -
-A OPT, --allow OPT
- 设置某一个Linter选项为Allow。 -
-D OPT, --deny OPT
- 设置某一个Linter选项为Deny。 -
-F OPT, --forbit OPT
- 设置某一个Linter选项为Forbit。 -
-C FLAG[=VAL], --codegen FLAG[=VAL]
- 目标代码生成的的相关参数,可以用-C help
来查看配置,值得关注的几个是linker=val
- 指定链接器;linker-args=val
- 指定链接器的参数;prefer-dynamic
- 默认Rust编译是静态链接,选择这个配置将改为动态链接;debug-info=level
- Debug信息级数,0
= 不生成,1
= 只生成文件行号表,2
= 全部生成;opt-level=val
- 优化级数,可选0-3
;debug_assertion
- 显式开启cfg(debug_assertion)
条件。
-
-V, --version
- 打印编译器版本号。 -
-v, --verbose
- 开启啰嗦模式(打印编译器执行的日志)。 -
--extern NAME=PATH
- 用来指定外部的Rust库(*.rlib
)名字和路径,名字应该与extern crate
中指定的一样。 -
--sysroot PATH
- 指定工具链根目录。 -
-Z flag
- 编译器Debug用的参数,可以用-Z help
来查看可用参数。 -
--color auto|always|never
- 输出时对日志加颜色auto
- 自动选择加还是不加,如果输出目标是虚拟终端(TTY)的话就加,否则就不加;always
- 给我加!never
- 你敢加?