You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust结构体中存储libloading加载的共享库函数指针?

解决libloading中Symbol与Library的生命周期绑定问题

你遇到的编译错误本质是Symbol的生命周期依赖于Library的存在,但你给Symbol指定了'static生命周期,而创建的Library实例仅在new函数内有效,编译器无法保证Symbol的'static约束,因此报错。

修正后的代码

use libloading::{Library, Symbol};

type MyFunctionType = fn() -> i32;

// 添加生命周期参数'a,绑定Symbol与Library的生命周期
pub struct MyStruct<'a> {
    library: Library,
    func1: Symbol<'a, MyFunctionType>,
    func2: Symbol<'a, MyFunctionType>,
}

impl<'a> MyStruct<'a> {
    pub fn new(library_path: &str) -> Result<Self, Box<dyn std::error::Error>> {
        let library = unsafe { Library::new(library_path)? };

        // 获取的Symbol生命周期与library一致,无需指定'static
        let func1: Symbol<'_, MyFunctionType> = unsafe { library.get(b"func1")? };
        let func2: Symbol<'_, MyFunctionType> = unsafe { library.get(b"func2")? };

        Ok(MyStruct {
            library,
            func1,
            func2,
        })
    }

    pub fn call_func1(&self) -> i32 {
        (self.func1)()
    }

    pub fn call_func2(&self) -> i32 {
        (self.func2)()
    }
}

关键修改说明

  • 给MyStruct添加生命周期参数'a,让Symbol的生命周期与结构体中的Library绑定,编译器会确保只要MyStruct实例存在,Library就不会被销毁,Symbol就能安全调用。
  • 移除Symbol的'static标注,改用与library一致的生命周期(这里用'_让编译器自动推导)。
  • 在impl块中声明对应的生命周期参数'a,保持结构体与方法的生命周期一致性。

这种方案完全符合Rust的安全规则,因为Symbol本质是对Library内部符号的引用,只要Library不被销毁,Symbol就始终有效,无需使用引用计数或Cow。

内容的提问来源于stack exchange,提问作者John Fehr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:53:13