有兩種類型的 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
鏈接變體。正確的變體由宋自動鏈接。