默认情况下,cargo build命令在源文件目录下查找文件,以确定构建什么,当它发现src/lib.rs的时候知道需要构建一个库。
src/lib.rs文件里面的代码是库的根模块,其他包访问我们的库的时候,只能访问根模块里面的公有项。
src/bin目录下的.rs源文件被认为是额外的可执行文件的源代码入口,cargo build的时候会为里面每个源文件构建一个二进制程序,构建完成之后可以用cargo run --bin efern运行构建好的efern程序。
含有src/lib.rs的库项目在本地可以供其他的项目依赖使用。比如如下配置:
[dependencies]
fern_sim = { path = "../fern_sim" }
rust语言的任何项都可以添加属性注解。你可以用#[allow]注解禁用某些警告,比如:#[allow(non_camel_case_types)]允许以非驼峰格式命名。
条件编译是以属性注解#[cfg]来实现的一个特性,它有如下常用选项:
test 测试被启用,会使用cargo test或者rustc --test命令构建
debug_assertions 调试断言被启用
unix 构建unix系统二进制程序
windows 构建windows二进制程序
target_pointer_width = "64" 目标64位系统
target_arch = "x86_64" 目标x86-64处理器架构
target_os = "macos" 目标操作系统macOS
feature = "robots" 启用用户自定义特性robots,构建命令cargo build --feature robots或者rustc --cfg feature="robots"
not(A) ???
all(A,B) ???
any(A,B) ???
需要控制函数内联的时候用#[inline]注解。当一个函数或者方法被另外的包调用的时候,rust不会内联它们,除非它是范型的或者显式声明为#[inline]。编译器认为#[inline]注解是一个建议,rust还支持更强硬的#[inline(always)]内联注解,强制要求使用到的地方内联,也可以用#[inline(never)]来要求一个函数永远不要被内联。
一些属性注解,比如#[cfg]和#[allow]可以加到整个模块以应用到所有。其他的比如#[test]和#[inline]则只能应用到独立的项里。
每个属性注解都有自己支持的参数,具体详情在网址https://doc.rust-lang.org/reference/attributes.html里面。
要给整个包加属性注解,需要加在main.rs或者lib.rs文件的顶部,并且用#!来替代#,比如#![non_camel_case_types]。#!告诉rust被附加的属性注解是给整个闭合块的,不是接下来的项。#!也可以用在函数、结构体里面,但是一般都用到文件的开头应用到,把属性注解应用到整个模块或者整个包。有些属性注解经常用#!语法,因为它们只能应用整个包。比如#![feature]属性注解,用来开启rust语言和库中尚不稳定的特性。这些特性是实验性的,可能存在bug或者将来接口会变化或者被移除。rust有128位的实验性整型数据类型i128和u128,但是由于是实验性的,你只能在rust的每日构建版本中使用它们。显式声明使用128位数据类型:#![feature(i128_type)]。随着时间推移,rust团队可能会把实验性特性稳定化,使它成为语言标准的一部分。这时#![feature]的这个属性就是多余的,使用它的话,rust会报警告并建议你移除它。
