【发布时间】:2014-03-17 17:41:57
【问题描述】:
Rust 有办法让程序可插入吗?在 C 中,我创建的插件是使用 dlopen 加载的 .so 文件。 Rust 是否提供了做同样事情的本机方式?
【问题讨论】:
Rust 有办法让程序可插入吗?在 C 中,我创建的插件是使用 dlopen 加载的 .so 文件。 Rust 是否提供了做同样事情的本机方式?
【问题讨论】:
Rust FAQ 正式认可libloading。除此之外,我知道还有三种不同的选择:
std::dynamic_lib,从 Rust 1.5 开始就是 deprecated。 (这些文档在 1.32 版中不再可用;现在很可能该功能已完全删除。)我没有尝试过任何这些,所以我不能真正说出哪个是最好的,或者不同变体的优缺点是什么。我强烈建议反对至少使用std::dynamic_lib,因为它已被弃用,并且可能在未来的某个时候被设为私有。
【讨论】:
没错,
以下是完整的用例示例:
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();
}
【讨论】:
是的。有一个模块std::unstable::dynamic_lib 可以动态加载库。但是,它没有记录,因为它是一个高度实验性的 API(std::unstable 中的所有内容都没有记录)。正如@dbaupp 建议的那样,the source 是最好的文档(当前版本是af9368452)。
【讨论】: