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)鏈接庫復(fù)制到新項目的根目錄,我的鏈接庫的名稱是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();
}
導(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)用動態(tài)鏈接庫的詳細內(nèi)容,更多關(guān)于Rust libloader動態(tài)鏈接庫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
rust多個mod文件引用和文件夾mod使用注意事項小結(jié)
在 Rust 項目中,可以使用 mod 關(guān)鍵字將一個文件夾或一個 rs 文件作為一個模塊引入到當(dāng)前文件中,本文給大家介紹rust多個mod文件引用和文件夾mod使用注意事項小結(jié),感興趣的朋友跟隨小編一起看看吧2024-03-03
Rust使用csv crate構(gòu)建CSV文件讀取器的全過程
這篇文章主要學(xué)習(xí)如何基于Rust使用csv這個crate構(gòu)建一個CSV文件讀取器的過程,學(xué)習(xí)了csv相關(guān)的用法以及一些往期學(xué)過的crate的復(fù)習(xí),兼顧了實用性和Rust的學(xué)習(xí),需要的朋友可以參考下2024-05-05
解讀Rust的Rc<T>:實現(xiàn)多所有權(quán)的智能指針方式
Rc<T> 是 Rust 中用于多所有權(quán)的引用計數(shù)類型,通過增加引用計數(shù)來管理共享數(shù)據(jù),只有當(dāng)最后一個引用離開作用域時,數(shù)據(jù)才會被釋放,Rc<T> 適用于單線程環(huán)境,并且只允許不可變共享數(shù)據(jù);需要可變共享時應(yīng)考慮使用 RefCell<T> 或其他解決方案2025-02-02

