web-dev-qa-db-ja.com

Rustに同等のdlopenがありますか?

Rustはプログラムをプラグイン可能にする方法があります。Cでは、作成するプラグインはdlopenでロードする.soファイルです。Rustはネイティブを提供します同じことをする方法は?

31
Matt

Rust FAQ 公式に承認 libloading 。それ以外に、私が知っている3つの異なるオプションがあります。

  • shared_library crate を使用します
  • dylib crate を使用します。
  • std::dynamic_lib を使用します。これは 非推奨 Rust 1.5であるためです。(これらのドキュメントはバージョン1.32では使用できなくなりました。おそらくこの機能は完全に削除されました。)

私はこれらのどれも試したことがないので、どれが最高であるか、またはさまざまなバリアントの長所/短所が何であるかを実際に言うことはできません。 Against には、少なくともstd::dynamic_libを使用することを強くお勧めします。これは非推奨であり、将来的に非公開になる可能性があるためです。

27
Per Lundberg

丁度、

そして、以下は完全なユースケースの例です:

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

はい。ライブラリの動的ロードを可能にするモジュールstd::unstable::dynamic_libがあります。ただし、これは非常に実験的なAPIであるため、文書化されていません(std::unstableのすべてが文書化されていません)。 @dbauppが示唆しているように、 ソース が最良のドキュメントです(現在のバージョンは af9368452 です)。

2
Lily Ballard