有两种类型的 Rust 库模块,一种生成 Rust 库,另一种生成 C 兼容库。此外,出于构建系统的目的,您可以将 Rust 过程宏( proc-macros
)视为一种特殊类型的库。
rust_library
rust_library
模块生成 Rust 库以供其他 Rust 模块使用。
除了_host
变体之外,Rust 库还有控制可用链接的模块类型。
Rust 库模块类型 | 定义 |
---|---|
rust_library | 提供库变体rlib 和dylib 。 AOSP 建议将这种模块类型用于 Rust 库,因为它允许模块在列为rustlibs 属性下的依赖项时正常工作 |
rust_library_rlib | 仅提供 Rust 库的rlib 变体;不能保证仅提供rlib 变体的模块可以与rustlibs 属性一起使用。 |
rust_library_dylib | 仅提供 Rust 库的dylib 变体;仅提供dylib 变体的模块不能保证与rustlibs 属性一起使用。 |
rust_ffi
rust_ffi
模块生成与 CC 模块互操作的 C 兼容库。
除了_host
变体,Rust FFI 库还有控制可用链接的模块类型,如下表所示。
Rust FFI 库模块类型 | 定义 |
---|---|
rust_ffi | 提供两种 C 库变体:静态和共享。 |
rust_ffi_shared | 仅提供 C 共享库变体。 |
rust_ffi_static | 仅提供 C 静态库变体。 |
有关使用rust_ffi
从 C 调用 Rust 的基本示例,请参阅Android Rust 模式页面。
有关更高级用法的信息,请访问Rust 官方文档。
rust_proc_macro
Rust 过程宏(proc-macros)可用于扩展编译器以执行源代码转换或提供新属性。更多信息可以在官方 Rust 文档的Procedural Macros页面中找到。
出于构建系统的目的, rust_proc_macro
模块的工作方式与rust_library
模块类似。对于依赖于rust_proc_macros
的模块,将模块名称添加到proc_macros
属性中。
由于proc_macros
是编译器插件,它们必然以主机为目标,并且不会生成任何可以在设备上运行的代码。
值得注意的 Rust 库属性
下表中定义的属性是对适用于所有模块的重要通用属性的补充。这些要么对 Rust 库模块特别重要,要么表现出特定于rust_library
模块类型的独特行为。
Rust 库属性 | 定义 |
---|---|
茎/名称 | stem 属性控制输出库文件名,否则默认为name 。 Rust 编译器对库文件名施加了某些要求,因此构建系统强制执行这些要求以避免编译问题。输出文件名必须符合格式 |
箱子名称 | 这是库生成模块的必需属性;它还与输出文件名有关系。 (见stem 定义。) |
包含目录 | 对于rust_ffi 模块,此属性定义表示相对包含路径的字符串列表:包含依赖cc 模块可以使用的标头的路径。 |
rust_library 或 rust_ffi 的链接
默认情况下,针对设备的 Rust 库模块总是与libstd
动态链接。然而,主机模块总是与libstd
静态链接。
用于rustlibs
依赖项的链接取决于根模块链接首选项。 (例如,带有rust_binary
的prefer_rlibs
将使用将rustlibs
链接为rlibs
的 Rust 库变体。)
为了允许生成不依赖于任何动态 rust 库(例如静态可执行文件)的根依赖模块, rlibs
提供了动态和静态libstd
链接变体。正确的变体由宋自动链接。