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