Rust是否有办法使程序可插入.在C中,我创建的插件是.so文件,我用dlopen加载.Rust提供了一种做同样事情的本地方式吗?
该锈FAQ正式认可libloading.除此之外,我知道有三种不同的选择:
使用shared_library包
使用dylib板条箱.
使用 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(); }