Подтвердить что ты не робот

Имеет ли ржавчина эквивалент dlopen

У Rust есть способ сделать программу подключаемой. В C плагины, которые я создаю, являются .so файлами, которые я загружаю с помощью dlopen. Rust обеспечивает собственный способ сделать то же самое?

4b9b3361

Ответ 1

Rust FAQ официально поддерживает загрузку. Помимо этого, есть три различных варианта, о которых я знаю:

  • Используйте shared_library crate
  • Используйте ящик для яиц.
  • Используйте std::dynamic_lib, который устарел начиная с Rust 1.5. (Эти документы больше не доступны в версии 1.32; скорее всего, к настоящему моменту эта функция вообще не добавлена).

Я не пробовал ни одного из них, поэтому я не могу сказать, какой из них лучший, а какие плюсы/минусы для разных вариантов. Я настоятельно рекомендую не использовать хотя бы std::dynamic_lib, учитывая, что он устарел и, скорее всего, в будущем станет конфиденциальным.

Ответ 2

Точно,

И ниже приведен пример полного использования:

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();
}

Ответ 3

Да. Там есть модуль std::unstable::dynamic_lib, который позволяет динамическую загрузку библиотек. Однако он недокументирован, поскольку он представляет собой очень экспериментальный API (все в std::unstable недокументировано). Как предлагает @dbaupp, источник является лучшей документацией (текущая версия af9368452).