Есть ли у Rust дубликат?
Есть ли у Rust способ сделать программу подключаемой. В C плагины, которые я создаю - это.so файлы, которые я загружаю с помощью dlopen. Предоставляет ли Rust собственный способ сделать то же самое?
3 ответа
Rust FAQ официально одобряет загрузку. Помимо этого, есть три различных варианта, о которых я знаю:
- Используйте ящик общего пользования
- Используйте ящик с дизлибом.
- использование
std::dynamic_lib
, который устарел начиная с Rust 1.5.
Я не пробовал ни одного из них, поэтому я не могу сказать, какой из них лучше, а какие плюсы и минусы для разных вариантов. Я бы настоятельно рекомендовал не использовать 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, источником является лучшая документация (текущая версия af9368452).