文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Rust使用libloader调用动态链接库

2024-04-02 19:55

关注

引言

最近需要使用Rust动态调用动态链接库,本来打算是使用libloading的,但是libloading在调用dll中的函数的时,是必须要在编译时确定参数和return的类型的。但后来发现了libloader这个包包,libloader是基于libloading的,但是操作起来却比libloader方便。

我们先需要一个动态链接库,我们可以使用cargo create project-name --lib创建一个动态链接库的项目,然后修改lib.rs后使用cargo build编译,我写了三种类型的函数

// lib.rs
#[no_mangle]
pub fn println(str: &str) { // 有参数没有返回值
    println!("{}", str);
}
#[no_mangle]
pub fn add(a: usize, b: usize) -> usize { // 有参数有返回值
    a + b
}
#[no_mangle]
pub fn print_hello() { // 没有参数没有返回值
    println!("Hello");
}

然后再用cargo create project-name --bin创建一个使用dll的项目

我们把编译出的动态链接库复制到新项目的根目录,我的链接库的名称是libstd.dylib.dylib是macOS编译出的链接库,如果你使用的是Linux或者Windows,则后缀名会是.so.dll

然后我们需要安装libloader的依赖,我们在Cargo.toml中的[dependencies]下添加libloader: "0.1.4"

[dependencies]
libloader: "0.1.4"

目前的最新版本是0.1.4,建议使用最新版本,最新版本可以在这里查看:libloader - crates.io: Rust Package Registry

main.rs 代码

use libloader::libloading

然后我们需要获取动态链接库中的函数,其中每个参数的作用已经在代码的注释标识了,值得注意的是,如果函数没有返回值,则可以用()代替。

get_libfn!("libstd.dylib", "println", my_println, (), str: &str); // 获取dll的函数
//          ^链接库路径      ^库中的函数 ^调用的名称 ^返回值   ^参数

下一步我们可以直接调用之前传给get_libfn"调用的名字"

my_println("Hello World"); // 输出 Hello World

其它函数也是一样,完整代码为:

// main.rs
use libloader::libloading // 首先需要引用libloader的libloading,侧面印证了libloader是基于libloading的
fn main() {
    get_libfn!("libstd.dylib", "println", my_println, (), str: &str); // 获取dll的函数
    //          ^链接库路径      ^库中的函数 ^调用的名称 ^返回值   ^参数
    my_println("Hello World");
    get_libfn!("libstd.dylib", "add", my_add, usize, a: usize, b: usize);
    println!("10 + 20 = {}", my_add(10, 20));
    get_libfn!("libstd.dylib", "print_hello", my_print_hello, ());
    my_print_hello();
}

导航:

libloader的crates.io: libloader - crates.io: Rust Package Registry

libloader的Github: Qixinies/libloader: A easy-to-use dll loader for rust that based on libloading (github.com)

以上就是Rust使用libloader调用动态链接库的详细内容,更多关于Rust libloader动态链接库的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯