Rust使用libloader调用动态链接库

09-14 117阅读 0评论

引言

最近需要使用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动态链接库的资料请关注云初冀北其它相关文章!

免责声明
本站提供的资源,都来自网络,版权争议与本站无关,所有内容及软件的文章仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,我们不保证内容的长久可用性,通过使用本站内容随之而来的风险与本站无关,您必须在下载后的24个小时之内,从您的电脑/手机中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。侵删请致信E-mail:goliszhou@gmail.com
$

发表评论

表情:
评论列表 (暂无评论,117人围观)

还没有评论,来说两句吧...