首页 文章

Rust有一个dlopen等价物

提问于
浏览
25

Rust是否有办法使程序可插入 . 在C中,我创建的插件是.so文件,我用dlopen加载 . Rust提供了一种做同样事情的本地方式吗?

3 回答

  • 2

    是 . 有一个模块 std::unstable::dynamic_lib ,可以动态加载库 . 它是一个高度实验性的API( std::unstable 中的所有内容都没有记录) . 正如@dbaupp建议的那样,the source是最好的文档(当前版本是af9368452) .

  • 22

    Rust FAQ正式支持libloading . 除此之外,我知道有三种不同的选择:

    我没有尝试过任何这些,所以我不能真正说出哪种是最好的,或者对于不同的变体有什么优缺点 . 我强烈建议 against 至少使用 std::dynamic_lib ,因为它已被弃用,并且很可能在未来某个时候被私有化 .

  • 13

    究竟,

    以下是完整的用例示例:

    use std::unstable::dynamic_lib::DynamicLibrary;
    use std::os;
    
    fn load_cuda_library()
    {
    
        let path = Path::new("/usr/lib/libcuda.so");
    
        // Make sure the path contains a / or the linker will search for it.
        let path = os::make_absolute(&path);
    
        let lib = match DynamicLibrary::open(Some(&path)) {
            Ok(lib) => lib,
            Err(error) => fail!("Could not load the library: {}", error)
        };
    
        // load cuinit symbol
    
        let cuInit: extern fn(u32) -> u32 = unsafe {
            match lib.symbol("cuInit") {
                Err(error) => fail!("Could not load function cuInit: {}", error),
                Ok(cuInit) => cuInit
            }
        };
    
        let argument = 0;
        let expected_result = 0;
        let result = cuInit(argument);
    
        if result != expected_result {
            fail!("cuInit({:?}) != {:?} but equaled {:?}",
                    argument, expected_result, result)
        }
    }
    
    fn main()
    {
        load_cuda_library();
    }
    

相关问题