rust程序由包构成,每个包是一个rust工程,一个库或者可执行程序的所有源代码,和一些关联的测试,例子,工具,配置等等。
cargo build --verbose选项会在构建过程输出详细信息到控制台。
extern crate num;告诉rust,num是一个外部库,不是自己程序的一部分。我们需要在Cargo.toml配置文件的dependencies段添加num库的引用。dependencies段表示后面的包是当前项目依赖的库,这些包发布在crates.io上。当我们运行cargo build命令的时候,它从crates.io上下载各个包指定版本的源代码,并读取下载到的包的Cargo.toml,继续下载它们的依赖,这样递归下去。一旦获得了所有源代码,Cargo就开始编译每个包,它为项目依赖图里的每个包运行rustc命令进行编译。在编译库的时候,Cargo命令会附上--crate-type lib选项,这告诉rustc不要查找main()函数,而是构建一个.rlib文件,用于别的代码调用。当编译一个程序用--crate-type bin选项的时候,会生成目标平台上的可执行二进制文件。
运行每个rustc命令,Cargo传递--extern选项加当前包依赖的所有库文件名。rust编译器需要访问.rlib文件,因为它包含了库编译后的代码,rust会静态链接代码到最终的可执行文件。.rlib文件还包含类型信息,这样rust可以检查使用的代码所需要的特征在库里面确实存在,并且正在正确地使用。它还包含包里面内联函数,泛型,宏和那些不能完全被编译成机器代码的特征的拷贝,直到它被我们的代码用到。
Cargo build --release命令会生成一个优化的构建。Release构建运行更快,但是编译它们需要更多的时间,Release构建不会检查整型溢出,它会忽略debug\_assert!()断言,并且它生成的调用跟踪栈在恐慌的时候不太可靠。
