亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Rust使用libloader調(diào)用動態(tài)鏈接庫

 更新時間:2022年09月13日 16:05:32   作者:七夕泥  
這篇文章主要為大家介紹了Rust使用libloader調(diào)用動態(tài)鏈接庫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

最近需要使用Rust動態(tài)調(diào)用動態(tài)鏈接庫,本來打算是使用libloading的,但是libloading在調(diào)用dll中的函數(shù)的時,是必須要在編譯時確定參數(shù)和return的類型的。但后來發(fā)現(xiàn)了libloader這個包包,libloader是基于libloading的,但是操作起來卻比libloader方便。

我們先需要一個動態(tài)鏈接庫,我們可以使用cargo create project-name --lib創(chuàng)建一個動態(tài)鏈接庫的項目,然后修改lib.rs后使用cargo build編譯,我寫了三種類型的函數(shù)

// lib.rs
#[no_mangle]
pub fn println(str: &str) { // 有參數(shù)沒有返回值
    println!("{}", str);
}
#[no_mangle]
pub fn add(a: usize, b: usize) -> usize { // 有參數(shù)有返回值
    a + b
}
#[no_mangle]
pub fn print_hello() { // 沒有參數(shù)沒有返回值
    println!("Hello");
}

然后再用cargo create project-name --bin創(chuàng)建一個使用dll的項目

我們把編譯出的動態(tài)鏈接庫復制到新項目的根目錄,我的鏈接庫的名稱是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

然后我們需要獲取動態(tài)鏈接庫中的函數(shù),其中每個參數(shù)的作用已經(jīng)在代碼的注釋標識了,值得注意的是,如果函數(shù)沒有返回值,則可以用()代替。

get_libfn!("libstd.dylib", "println", my_println, (), str: &str); // 獲取dll的函數(shù)
//          ^鏈接庫路徑      ^庫中的函數(shù) ^調(diào)用的名稱 ^返回值   ^參數(shù)

下一步我們可以直接調(diào)用之前傳給get_libfn"調(diào)用的名字"

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

其它函數(shù)也是一樣,完整代碼為:

// main.rs
use libloader::libloading // 首先需要引用libloader的libloading,側(cè)面印證了libloader是基于libloading的
fn main() {
    get_libfn!("libstd.dylib", "println", my_println, (), str: &str); // 獲取dll的函數(shù)
    //          ^鏈接庫路徑      ^庫中的函數(shù) ^調(diào)用的名稱 ^返回值   ^參數(shù)
    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調(diào)用動態(tài)鏈接庫的詳細內(nèi)容,更多關(guān)于Rust libloader動態(tài)鏈接庫的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Rust語言開發(fā)環(huán)境搭建詳細教程(圖文教程)

    Rust語言開發(fā)環(huán)境搭建詳細教程(圖文教程)

    本文主要介紹了rust編程語言在windows上開發(fā)環(huán)境的搭建方法,文中通過圖文的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02
  • Rust中Cargo的使用詳解

    Rust中Cargo的使用詳解

    Cargo 是 Rust 的構(gòu)建系統(tǒng)和包管理器,?多數(shù) Rustacean 們使? Cargo 來管理他們的 Rust 項?,因為它可以為你處理很多任務,?如構(gòu)建代碼、下載依賴庫并編譯這些庫,這篇文章主要介紹了Rust中Cargo的使用,需要的朋友可以參考下
    2022-11-11
  • 深入了解Rust中函數(shù)與閉包的使用

    深入了解Rust中函數(shù)與閉包的使用

    本文主要介紹一下Rust函數(shù)相關(guān)的內(nèi)容,首先函數(shù)我們其實一直都在用,所以函數(shù)本身沒什么可說的,我們的重點是與函數(shù)相關(guān)的閉包、高階函數(shù)、發(fā)散函數(shù),感興趣的可以學習一下
    2022-11-11
  • Rust語言之結(jié)構(gòu)體和枚舉的用途與高級功能詳解

    Rust語言之結(jié)構(gòu)體和枚舉的用途與高級功能詳解

    Rust 是一門注重安全性和性能的現(xiàn)代編程語言,其中結(jié)構(gòu)體和枚舉是其強大的數(shù)據(jù)類型之一,了解結(jié)構(gòu)體和枚舉的概念及其高級功能,將使你能夠更加靈活和高效地處理數(shù)據(jù),本文將深入探討 Rust 中的結(jié)構(gòu)體和枚舉,并介紹它們的用途和高級功能
    2023-10-10
  • vscode搭建rust開發(fā)環(huán)境的圖文教程

    vscode搭建rust開發(fā)環(huán)境的圖文教程

    Rust 是一種系統(tǒng)編程語言,它專注于內(nèi)存安全、并發(fā)和性能,本文主要介紹了vscode搭建rust開發(fā)環(huán)境的圖文教程,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Rust 枚舉和模式匹配的實現(xiàn)

    Rust 枚舉和模式匹配的實現(xiàn)

    枚舉是 Rust 中非常重要的復合類型,也是最強大的復合類型之一,廣泛用于屬性配置、錯誤處理、分支流程、類型聚合等場景中,本文就來介紹一下Rust 枚舉和模式匹配,感興趣的可以了解一下
    2023-12-12
  • Rust中的panic定義及觸發(fā)條件詳解

    Rust中的panic定義及觸發(fā)條件詳解

    這篇文章主要為大家介紹了Rust中的panic定義及觸發(fā)條件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 一文掌握Rust編程中的生命周期

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

    在Rust語言中, 每一個引用都有其生命周期, 通俗講就是每個引用在程序執(zhí)行的過程中都有其自身的作用域, 一旦離開其作用域, 其生命周期也宣告結(jié)束, 值不再有效,這篇文章主要介紹了Rust編程中的生命周期,需要的朋友可以參考下
    2023-11-11
  • Rust?實現(xiàn)?async/await的詳細代碼

    Rust?實現(xiàn)?async/await的詳細代碼

    異步編程在 Rust 中的地位非常高,很多 crate 尤其是多IO操作的都使用了 async/await,這篇文章主要介紹了Rust?如何實現(xiàn)?async/await,需要的朋友可以參考下
    2022-09-09
  • 詳解在Rust語言中如何聲明可變的static類型變量

    詳解在Rust語言中如何聲明可變的static類型變量

    在Rust中,可以使用lazy_static宏來聲明可變的靜態(tài)變量,lazy_static是一個用于聲明延遲求值靜態(tài)變量的宏,本文將通過一個簡單的例子,演示如何使用?lazy_static?宏來聲明一個可變的靜態(tài)變量,需要的朋友可以參考下
    2023-08-08

最新評論