Plugins 锈蚀是否具有dlopen等效物

Plugins 锈蚀是否具有dlopen等效物,plugins,rust,Plugins,Rust,Rust是否有办法使程序可插拔。在C语言中,我创建的插件是使用dlopen加载的.so文件。生锈是否提供了一种做同样事情的自然方式?是的。有一个模块可以动态加载库。不过,它没有文档化,因为它是一个高度实验性的API(std::unstable中的所有内容都没有文档化)。正如@dbaupp所建议的,是最好的文档(当前版本是)。确切地说 下面是完整的用例示例: use std::unstable::dynamic_lib::DynamicLibrary; use std::os; fn load_

Rust是否有办法使程序可插拔。在C语言中,我创建的插件是使用dlopen加载的.so文件。生锈是否提供了一种做同样事情的自然方式?

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

确切地说

下面是完整的用例示例:

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();
}
政府正式表示赞同。除此之外,我知道有三种不同的选择:

  • 使用
  • 使用
  • 使用,这是因为生锈1.5。(这些文档在1.32版中不再可用;很可能到目前为止,该功能已全部删除。)

我没有尝试过任何一种,因此我无法真正说出哪种是最好的,或者不同变体的优缺点是什么。我强烈建议至少不要使用
std::dynamic_lib
,因为它已被弃用,将来可能会被私有化。

(这是最好的文档)。我假设这会加载任何与C兼容的库?我假设像dlopen那样加载符号实际上并不知道函数签名,这意味着您不能真正确定是否使用正确的参数调用函数。这似乎破坏了Rust给您带来的安全性,但我想随意加载其他代码并不一定是最安全的事情,您是完全正确的。可以加载任何与C兼容的库。不幸的是,它破坏了安全。不过,上述计划可能会有所改变。Rust开发人员将为库的动态加载添加一种安全的方法,请参阅记录,问题#458已关闭,新的已被再次移动(因为它没有进入Rust的1.0版本):我认为这不应该是批准的答案@Matt,它表明使用了不稳定,在生锈的环境中不易获得功能。Rust常见问题解答给出了与此不同的建议(更多详细信息,请参见我对这个问题的回答)。是的,libloading现在似乎是被认可的方法。