macro_rules! export {
($create:path) => { ... };
}Expand description
生成插件的整个 C ABI 外壳。
用法是一行:
ⓘ
impl pmpx_plugin::PackageManager for MyPlugin { /* ... */ }
/// 工厂函数。crate-plugin-kit 生成的 wrapper 工程也会调它。
pub fn create() -> Box<dyn pmpx_plugin::PackageManager> {
Box::new(MyPlugin)
}
pmpx_plugin::export!(create);§它生成了什么
| 符号 | 作用 |
|---|---|
pmpx_plugin_entry_v1 | 唯一入口。返回一张 'static 的 PmpxPluginV1 表 |
name / family shim | 调你的实现,把 &str 泄漏成 PmpxStr |
command shim | 读输入 → 调 crate::PackageManager::command → 写输出 |
free_str / free_command | 把上面产出的内存还回来 |
§输入必须是函数的路径
create 必须是一个返回 Box<dyn PackageManager> 的函数。不能传类型名,
因为你可能想在里面做构造参数注入。
这个形状不是随意定的:crate-plugin-kit 生成的 wrapper 工程里,
src/lib.rs 的内容正是 <你的 crate>::create 的调用 —— 两边必须对得上。
§每次调用都新建实例,刻意不缓存
宿主一个进程只调几次(name / family 各一次,command 一次),
而缓存需要 OnceLock + 静态量 + Send + Sync 约束。为几次 Box::new 引入这些
不划算,也让生成的代码更难读。