Rust是否有一种使程序可插拔的方式。在C语言中,我创建的插件是.so文件,使用dlopen加载。Rust是否提供了原生方法来完成相同的操作?
Rust FAQ 正式推荐使用 libloading。除此之外,我知道还有三种不同的选项:
std::dynamic_lib
, 这个功能自 Rust 1.5 版本以来已经被弃用。(这些文档在版本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();
}