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

Rust使用libloader調(diào)用動(dòng)態(tài)鏈接庫(kù)

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

引言

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

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

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

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

我們把編譯出的動(dòng)態(tài)鏈接庫(kù)復(fù)制到新項(xiàng)目的根目錄,我的鏈接庫(kù)的名稱是libstd.dylib,.dylib是macOS編譯出的鏈接庫(kù),如果你使用的是Linux或者Windows,則后綴名會(huì)是.so.dll

然后我們需要安裝libloader的依賴,我們?cè)?code>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

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

get_libfn!("libstd.dylib", "println", my_println, (), str: &str); // 獲取dll的函數(shù)
//          ^鏈接庫(kù)路徑      ^庫(kù)中的函數(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ù)
    //          ^鏈接庫(kù)路徑      ^庫(kù)中的函數(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();
}

導(dǎo)航:

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)用動(dòng)態(tài)鏈接庫(kù)的詳細(xì)內(nèi)容,更多關(guān)于Rust libloader動(dòng)態(tài)鏈接庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • rust交叉編譯問(wèn)題及報(bào)錯(cuò)解析

    rust交叉編譯問(wèn)題及報(bào)錯(cuò)解析

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

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

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

    凤山市| 于田县| 崇文区| 宜城市| 宿松县| 天全县| 墨竹工卡县| 临朐县| 昌宁县| 彝良县| 教育| 上饶市| 沙坪坝区| 土默特右旗| 嘉善县| 东丰县| 泰宁县| 西乌珠穆沁旗| 屏南县| 安多县| 邵东县| 乡城县| 临清市| 商都县| 普兰县| 兰考县| 大庆市| 舟山市| 卢龙县| 贺兰县| 南江县| 九台市| 镇坪县| 靖西县| 宣城市| 大厂| 昌宁县| 蒙城县| 子洲县| 肇州县| 玉门市|