Rust使用libloader调用动态链接库

 更新时间:2022年09月13日 16:05:32   作者:七夕泥  
这篇文章主要为大家介绍了Rust使用libloader调用动态链接库示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

最近需要使用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动态链接库的资料请关注脚本之家其它相关文章!

相关文章

  • Rust语言开发环境搭建详细教程(图文教程)

    Rust语言开发环境搭建详细教程(图文教程)

    本文主要介绍了rust编程语言在windows上开发环境的搭建方法,文中通过图文的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • Rust中Cargo的使用详解

    Rust中Cargo的使用详解

    Cargo 是 Rust 的构建系统和包管理器,⼤多数 Rustacean 们使⽤ Cargo 来管理他们的 Rust 项⽬,因为它可以为你处理很多任务,⽐如构建代码、下载依赖库并编译这些库,这篇文章主要介绍了Rust中Cargo的使用,需要的朋友可以参考下
    2022-11-11
  • 深入了解Rust中函数与闭包的使用

    深入了解Rust中函数与闭包的使用

    本文主要介绍一下Rust函数相关的内容,首先函数我们其实一直都在用,所以函数本身没什么可说的,我们的重点是与函数相关的闭包、高阶函数、发散函数,感兴趣的可以学习一下
    2022-11-11
  • Rust语言之结构体和枚举的用途与高级功能详解

    Rust语言之结构体和枚举的用途与高级功能详解

    Rust 是一门注重安全性和性能的现代编程语言,其中结构体和枚举是其强大的数据类型之一,了解结构体和枚举的概念及其高级功能,将使你能够更加灵活和高效地处理数据,本文将深入探讨 Rust 中的结构体和枚举,并介绍它们的用途和高级功能
    2023-10-10
  • vscode搭建rust开发环境的图文教程

    vscode搭建rust开发环境的图文教程

    Rust 是一种系统编程语言,它专注于内存安全、并发和性能,本文主要介绍了vscode搭建rust开发环境的图文教程,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Rust 枚举和模式匹配的实现

    Rust 枚举和模式匹配的实现

    枚举是 Rust 中非常重要的复合类型,也是最强大的复合类型之一,广泛用于属性配置、错误处理、分支流程、类型聚合等场景中,本文就来介绍一下Rust 枚举和模式匹配,感兴趣的可以了解一下
    2023-12-12
  • Rust中的panic定义及触发条件详解

    Rust中的panic定义及触发条件详解

    这篇文章主要为大家介绍了Rust中的panic定义及触发条件详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 一文掌握Rust编程中的生命周期

    一文掌握Rust编程中的生命周期

    在Rust语言中, 每一个引用都有其生命周期, 通俗讲就是每个引用在程序执行的过程中都有其自身的作用域, 一旦离开其作用域, 其生命周期也宣告结束, 值不再有效,这篇文章主要介绍了Rust编程中的生命周期,需要的朋友可以参考下
    2023-11-11
  • Rust 实现 async/await的详细代码

    Rust 实现 async/await的详细代码

    异步编程在 Rust 中的地位非常高,很多 crate 尤其是多IO操作的都使用了 async/await,这篇文章主要介绍了Rust 如何实现 async/await,需要的朋友可以参考下
    2022-09-09
  • 详解在Rust语言中如何声明可变的static类型变量

    详解在Rust语言中如何声明可变的static类型变量

    在Rust中,可以使用lazy_static宏来声明可变的静态变量,lazy_static是一个用于声明延迟求值静态变量的宏,本文将通过一个简单的例子,演示如何使用 lazy_static 宏来声明一个可变的静态变量,需要的朋友可以参考下
    2023-08-08

最新评论