日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Rust使用libloader調用動態鏈接庫_Rust語言

作者:七夕泥 ? 更新時間: 2022-11-05 編程語言

引言

最近需要使用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)

原文鏈接:https://juejin.cn/post/7142490653241540621

欄目分類
最近更新