Rust有一个dlopen等价物

时间:2014-03-17 17:41:57

标签: plugins rust

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

3 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分: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();
}

答案 2 :(得分:2)

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