Rust使用libloader調(diào)用動(dòng)態(tài)鏈接庫(kù)
引言
最近需要使用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)型的。但后來(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
編譯,我寫(xiě)了三種類(lèi)型的函數(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ù)的名稱(chēng)是libstd.dylib
,.dylib
是macOS編譯出的鏈接庫(kù),如果你使用的是Linux或者Windows,則后綴名會(huì)是.so
和.dll
然后我們需要安裝libloader的依賴(lài),我們?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)用的名稱(chēng) ^返回值 ^參數(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)用的名稱(chēng) ^返回值 ^參數(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語(yǔ)言開(kāi)發(fā)環(huán)境搭建詳細(xì)教程(圖文教程)
本文主要介紹了rust編程語(yǔ)言在windows上開(kāi)發(fā)環(huán)境的搭建方法,文中通過(guò)圖文的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02Rust語(yǔ)言之結(jié)構(gòu)體和枚舉的用途與高級(jí)功能詳解
Rust 是一門(mén)注重安全性和性能的現(xiàn)代編程語(yǔ)言,其中結(jié)構(gòu)體和枚舉是其強(qiáng)大的數(shù)據(jù)類(lèi)型之一,了解結(jié)構(gòu)體和枚舉的概念及其高級(jí)功能,將使你能夠更加靈活和高效地處理數(shù)據(jù),本文將深入探討 Rust 中的結(jié)構(gòu)體和枚舉,并介紹它們的用途和高級(jí)功能2023-10-10vscode搭建rust開(kāi)發(fā)環(huán)境的圖文教程
Rust 是一種系統(tǒng)編程語(yǔ)言,它專(zhuān)注于內(nèi)存安全、并發(fā)和性能,本文主要介紹了vscode搭建rust開(kāi)發(fā)環(huán)境的圖文教程,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03Rust?實(shí)現(xiàn)?async/await的詳細(xì)代碼
異步編程在 Rust 中的地位非常高,很多 crate 尤其是多IO操作的都使用了 async/await,這篇文章主要介紹了Rust?如何實(shí)現(xiàn)?async/await,需要的朋友可以參考下2022-09-09詳解在Rust語(yǔ)言中如何聲明可變的static類(lèi)型變量
在Rust中,可以使用lazy_static宏來(lái)聲明可變的靜態(tài)變量,lazy_static是一個(gè)用于聲明延遲求值靜態(tài)變量的宏,本文將通過(guò)一個(gè)簡(jiǎn)單的例子,演示如何使用?lazy_static?宏來(lái)聲明一個(gè)可變的靜態(tài)變量,需要的朋友可以參考下2023-08-08