Rust:使用libloader调用动态链接库 (DLL)

2023-05-16

掘金为同人创作:掘金
最近需要使用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的代码

我们需要先引用libloader内置的libloading,这侧面印证了libloader是基于libloading的

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust:使用libloader调用动态链接库 (DLL) 的相关文章

随机推荐

  • 【SpringBoot+阿里云ssl】完成 http转https以及ws转wss

    SpringBoot 43 阿里云ssl完成 http转https以及ws转wss 前言一 HTTP转HTTPS二 ws转wss 前言 本文工作是建立在已经有一个SSL证书的基础之上 阿里云证书如何申请可以参考以下链接 xff1a 阿里云免
  • 【python】pyplot绘制横轴为时间的图

    1 导入环境 span class token keyword import span numpy span class token keyword as span np span class token keyword import sp
  • 【Python】numpy二维数组删除指定行和列

    Python numpy二维数组删除指定行和列 1 原始数据2 删除指定行3 删除指定列4 删除指定多行和多列 1 原始数据 span class token keyword print span span class token punc
  • 【Pytorch】深度学习快速上手心得

    Pytorch 深度学习快速上手心得 前言一 环境安装1 1 安装Anaconda1 2 Anaconda 常见指令1 4 Pytorch环境安装1 3 Jupyter安装 二 一个简单的demo快速入门深度学习2 1 环境依赖2 2 数据
  • 【nginx】快速入门——SpringBoot项目代理及图片代理

    nginx快速入门 1 简介2 Ngnix下载2 Nginx启动与停止2 1 启动2 2 关闭2 3 重新启动 3 Ngnix配置文件4 SpringBoot项目代理5 图片代理6 代理html页面 1 简介 nginx engine x
  • 【Nginx+SSL】在华为云和腾讯云上配置Nginx+SSL,实现Http转Https

    Nginx 43 SSL 在华为云和腾讯云上配置Nginx 43 SSL xff0c 实现Http转Https 0 前言0 1 腾讯云证书下载0 2 华为云证书下载 1 Nginx的SSL模块安装2 SSL证书上传3 Nginx的配置3 1
  • 【大论文中注意事项】2022年11月3日记录

    大论文中注意事项 1 时间安排2 论文标题3 摘要4 自己的内容 重要 5 第一章的全文研究内容6 关于正文中的序号7 第一章的课题来源8 文章9 文献10 第一章的本文主要研究内容11 实验的对比12 每一章的小节13 章节正文开始14
  • 【文件上传】前端html上传 + 后端SpringBoot接收并保存

    1 前端页面 lt form gt 记得设置一下enctype 61 34 multipart form data 34 span class token doctype span class token punctuation lt sp
  • linux系统下,11款常见远程桌面控制软件

    远程控制能够给人们带来很多便利 xff0c 本文介绍了11款常见的Linux系统下的远程桌面控制工具 xff0c 总有一款能适合您 一 Grdc 它是一个用GTK 43 编写的 xff0c 适用于gnome桌面环境的远程桌面访问软件 看图
  • ubuntu远程桌面到Windows

    我知道的有两种方法 xff1a 1 xff09 使用Terminal Server Client 打开Applications gt Internet gt Terminal Server Client xff0c 在 General 选项
  • 交叉编译 WPA_Supplicant

    本文记录这个wifi配置工具的编译过程 xff0c 步骤不少 xff0c 涉及的开源代码包也比较多 xff0c 以后很容易忘 WPA Supplicant简介 首先 xff0c 稍稍介绍下wpa supplicant xff0c 这是一个控
  • UltraEdit 最新安装教程

    1 下载完成UltraEdit 之后 xff0c 双击应用程序 xff0c 选择安装位置 xff0c 点击安装 2 点击下一步 3 安装完成 4 首次登录 xff0c 提示输入许可证秘钥 5 输入激活码页面 xff0c 输入后点击激活
  • Pyside2 学习系列二:PyInstaller打包项目exe (超详细的Pyside2 攻略)

    继上一篇文章创建了项目后 xff0c 本章我们进行项目的打包工作 本项目的所有演示代码 xff1a github可在这里下载 打包只用的工具为PyInstaller 打包步骤 1 准备环境1 1 安装 96 PyInstaller 96 2
  • JSP中的四种范围属性

    JSP中的对象 xff0c 包括用户创建的对象 如JavaBean对象 和JSP的隐含对象 xff0c 都有一个范围属性 范围属性规定了这些对象的作用域 xff0c 定义了在什么时间内 xff0c 在哪一个JSP页面中可以被访问 在JSP中
  • 【xml】[Qt] 生成xml格式对象或xml字符串(速成 QT处理xml)

    本文为什么称为速成呢 xff0c 因为本人就是速成的 xff0c 接手的项目里有个关于xml的bug xff0c 对xml一无所知到解决bug xff0c 自己硬着头皮上 xff0c 速成成功了 xff0c 也就觉得有写点什么东西的必要了
  • Mysql8.0如何重置密码

    环境 xff1a mysql8 0以上版本 无密码登录 修改配置文件 xff1a etc my cnf xff0c 在 mysqld 后面任意一行添加 skip grant tables xff0c 这样登录时就可以跳过密码验证的过程 重启
  • 华为交换机配置SNMP

    SNMP参数详情 Quidway snmp agent community 为SNMPv1 amp SNMPv2c访问设置团体名group 设置基于用户安全模型的组local engineid 设置本地SNMP实体的引擎IDmib view
  • VMware设置虚拟机的网络为桥接模式,虚拟机使用主机的网段,虚拟机设置和主机一样的网关(网段)

    VMware设置虚拟机的网络为桥接模式 KeyValue电脑版本win 10 1909虚拟机版本 VMware 17 点击编辑虚拟机设置 这样虚拟机即可在和主机在同一个网段 验证 虚拟机的地址 xff1a 192 168 2 144 ip
  • Rust权威指南 读书笔记

    Rust权威指南 本书由 Rust 核心开发团队编写而成 xff0c 由浅入深地探讨了 Rust 语言的方方面面 从学习函数 选择数据结构及绑定变量入手 xff0c 逐步介绍所有权 trait 生命周期 安全保证等高级概念 xff0c 模式
  • Rust:使用libloader调用动态链接库 (DLL)

    掘金为同人创作 xff1a 掘金 最近需要使用Rust动态调用动态链接库 xff0c 本来打算是使用libloading的 xff0c 但是libloading在调用dll中的函数的时 xff0c 是必须要在编译时确定参数和return的类