外部 crate 声明
语法:
ExternCrate :
extern
crate
CrateRef AsClause?;
CrateRef :
标识符 |self
AsClause :
as
( 标识符 |_
)
extern crate
声明指定对外部 crate 的依赖关系。然后,外部 crate 将作为 extern crate
声明中提供的 标识符 绑定到声明范围。此外,如果 extern crate
出现在 crate 根目录中,则 crate 名称也会添加到 外部前奏 中,使其在所有模块中自动处于作用域内。as
子句可用于将导入的 crate 绑定到不同的名称。
外部 crate 在编译时解析为特定的 soname
,并且将运行时链接到该 soname
的要求传递给链接器,以便在运行时加载。soname
在编译时通过扫描编译器的库路径并将提供的可选 crate_name
与编译外部 crate 时在其上声明的 crate_name
属性 进行匹配来解析。如果没有提供 crate_name
,则假定默认的 name
属性,等于 extern crate
声明中给出的 标识符。
可以导入 self
crate,这将创建与当前 crate 的绑定。在这种情况下,必须使用 as
子句指定要将其绑定到的名称。
extern crate
声明的三个示例
extern crate pcre;
extern crate std; // equivalent to: extern crate std as std;
extern crate std as ruststd; // linking to 'std' under another name
命名 Rust crate 时,不允许使用连字符。但是,Cargo 包可以使用它们。在这种情况下,当 Cargo.toml
未指定 crate 名称时,Cargo 会透明地将 -
替换为 _
(有关详细信息,请参阅 RFC 940)。
以下是一个示例
// Importing the Cargo package hello-world
extern crate hello_world; // hyphen replaced with an underscore
外部前奏
本节已移至 前奏 — 外部前奏。
下划线导入
可以通过使用带有 extern crate foo as _
形式的下划线来声明外部 crate 依赖项,而无需在其作用域中绑定其名称。这对于只需要链接但从不引用的 crate 很有用,并且可以避免将其报告为未使用。
macro_use
属性 照常工作,并将宏名称导入 macro_use
前奏。
no_link
属性
可以在 extern crate
项上指定no_link
属性,以防止将 crate 链接到输出中。这通常用于加载 crate 以仅访问其宏。