广告位联系
返回顶部
分享到

Rust使用libloader调用动态链接库的介绍

相关技巧 来源:互联网 作者:佚名 发布时间:2022-09-16 20:36:31 人浏览
摘要

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

// 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"

1

2

[dependencies]

libloader: "0.1.4"

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

main.rs 代码

1

use libloader::libloading

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

1

2

get_libfn!("libstd.dylib", "println", my_println, (), str: &str); // 获取dll的函数

//          ^链接库路径      ^库中的函数 ^调用的名称 ^返回值   ^参数

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

1

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

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

1

2

3

4

5

6

7

8

9

10

11

// 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 https://crates.io/crates/libloader

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://juejin.cn/post/7142490653241540621
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计