当前位置:  开发笔记 > 后端 > 正文

Rust有一个dlopen等价物

如何解决《Rust有一个dlopen等价物》经验,为你挑选了2个好方法。

Rust是否有办法使程序可插入.在C中,我创建的插件是.so文件,我用dlopen加载.Rust提供了一种做同样事情的本地方式吗?



1> Per Lundberg..:

该锈FAQ正式认可libloading.除此之外,我知道有三种不同的选择:

使用shared_library包

使用dylib板条箱.

使用 std::dynamic_lib,自Rust 1.5以来已弃用.(这些文档在版本1.32中不再可用;到目前为止,该功能可能已完全删除.)

我没有尝试过任何这些,所以我不能说哪个最好或者不同变体的优缺点是什么.我强烈建议不要std::dynamic_lib至少使用它,因为它已被弃用,并且很可能在未来某个时候被私有化.



2> Alexander Sa..:

究竟,

以下是完整的用例示例:

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


对于recors,问题#458已经关闭,新的问题是https://github.com/rust-lang/rust/issues/15040
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有