最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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,側面印證了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)容,更多關于Rust libloader動態(tài)鏈接庫的資料請關注腳本之家其它相關文章!

相關文章

  • Rust你不認識的所有權

    Rust你不認識的所有權

    所有權對大多數(shù)開發(fā)者而言是一個新穎的概念,它是 Rust 語言為高效使用內(nèi)存而設計的語法機制。所有權概念是為了讓 Rust 在編譯階段更有效地分析內(nèi)存資源的有用性以實現(xiàn)內(nèi)存管理而誕生的概念
    2023-01-01
  • rust多個mod文件引用和文件夾mod使用注意事項小結

    rust多個mod文件引用和文件夾mod使用注意事項小結

    在 Rust 項目中,可以使用 mod 關鍵字將一個文件夾或一個 rs 文件作為一個模塊引入到當前文件中,本文給大家介紹rust多個mod文件引用和文件夾mod使用注意事項小結,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Rust生成隨機數(shù)的項目實踐

    Rust生成隨機數(shù)的項目實踐

    Rust標準庫中并沒有隨機數(shù)生成器,常見的解決方案是使用rand包,本文主要介紹了Rust生成隨機數(shù)的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Rust讀取配置文件的實現(xiàn)

    Rust讀取配置文件的實現(xiàn)

    本文主要介紹了Rust讀取配置文件的實現(xiàn),主要讀取Cargo.toml文件,讀取.env文件和讀取自定義toml文件這三種,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Rust使用csv crate構建CSV文件讀取器的全過程

    Rust使用csv crate構建CSV文件讀取器的全過程

    這篇文章主要學習如何基于Rust使用csv這個crate構建一個CSV文件讀取器的過程,學習了csv相關的用法以及一些往期學過的crate的復習,兼顧了實用性和Rust的學習,需要的朋友可以參考下
    2024-05-05
  • rust智能指針的具體使用

    rust智能指針的具體使用

    智能指針是一些數(shù)據(jù)結構,它們的行為類似于指針但擁有額外的元數(shù)據(jù)和附加功能,本文就來介紹一下rust智能指針的具體使用,感興趣的可以了解一下
    2023-12-12
  • Rust突破編譯器限制構造可修改的全局變量

    Rust突破編譯器限制構造可修改的全局變量

    這篇文章主要為大家介紹了Rust突破編譯器限制構造可修改的全局變量示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 解讀Rust的Rc<T>:實現(xiàn)多所有權的智能指針方式

    解讀Rust的Rc<T>:實現(xiàn)多所有權的智能指針方式

    Rc<T> 是 Rust 中用于多所有權的引用計數(shù)類型,通過增加引用計數(shù)來管理共享數(shù)據(jù),只有當最后一個引用離開作用域時,數(shù)據(jù)才會被釋放,Rc<T> 適用于單線程環(huán)境,并且只允許不可變共享數(shù)據(jù);需要可變共享時應考慮使用 RefCell<T> 或其他解決方案
    2025-02-02
  • rust交叉編譯問題及報錯解析

    rust交叉編譯問題及報錯解析

    這篇文章主要為大家介紹了rust交叉編譯問題及報錯解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 探索Rust切片與Go有何區(qū)別

    探索Rust切片與Go有何區(qū)別

    這篇文章主要為大家介紹了Rust切片與Go的區(qū)別探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01

最新評論

玉屏| 曲阜市| 五台县| 惠州市| 公主岭市| 南康市| 宜兰市| 彝良县| 三明市| 永川市| 台中县| 西华县| 左云县| 锡林郭勒盟| 达孜县| 离岛区| 伊金霍洛旗| 西城区| 灵丘县| 区。| 芷江| 黄浦区| 海阳市| 元氏县| 潞西市| 梓潼县| 潢川县| 天镇县| 电白县| 宁安市| 黄平县| 海宁市| 阿坝县| 灵寿县| 崇义县| 堆龙德庆县| 锡林郭勒盟| 子长县| 晋城| 平潭县| 桂东县|