外部 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 前奏

可以在 extern crate 项上指定no_link 属性,以防止将 crate 链接到输出中。这通常用于加载 crate 以仅访问其宏。