Rustはプログラムをプラグイン可能にする方法があります。Cでは、作成するプラグインはdlopenでロードする.soファイルです。Rustはネイティブを提供します同じことをする方法は?
Rust FAQ 公式に承認 libloading 。それ以外に、私が知っている3つの異なるオプションがあります。
std::dynamic_lib
を使用します。これは 非推奨 Rust 1.5であるためです。(これらのドキュメントはバージョン1.32では使用できなくなりました。おそらくこの機能は完全に削除されました。)私はこれらのどれも試したことがないので、どれが最高であるか、またはさまざまなバリアントの長所/短所が何であるかを実際に言うことはできません。 Against には、少なくとも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();
}