網站首頁 編程語言 正文
引言
最近需要使用Rust動態調用動態鏈接庫,本來打算是使用libloading
的,但是libloading
在調用dll中的函數的時,是必須要在編譯時確定參數和return的類型的。但后來發現了libloader
這個包包,libloader
是基于libloading
的,但是操作起來卻比libloader
方便。
我們先需要一個動態鏈接庫,我們可以使用cargo create project-name --lib
創建一個動態鏈接庫的項目,然后修改lib.rs
后使用cargo build
編譯,我寫了三種類型的函數
// lib.rs #[no_mangle] pub fn println(str: &str) { // 有參數沒有返回值 println!("{}", str); } #[no_mangle] pub fn add(a: usize, b: usize) -> usize { // 有參數有返回值 a + b } #[no_mangle] pub fn print_hello() { // 沒有參數沒有返回值 println!("Hello"); }
然后再用cargo create project-name --bin
創建一個使用dll的項目
我們把編譯出的動態鏈接庫復制到新項目的根目錄,我的鏈接庫的名稱是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
然后我們需要獲取動態鏈接庫中的函數,其中每個參數的作用已經在代碼的注釋標識了,值得注意的是,如果函數沒有返回值,則可以用()
代替。
get_libfn!("libstd.dylib", "println", my_println, (), str: &str); // 獲取dll的函數 // ^鏈接庫路徑 ^庫中的函數 ^調用的名稱 ^返回值 ^參數
下一步我們可以直接調用之前傳給get_libfn
的"調用的名字"
my_println("Hello World"); // 輸出 Hello World
其它函數也是一樣,完整代碼為:
// main.rs use libloader::libloading // 首先需要引用libloader的libloading,側面印證了libloader是基于libloading的 fn main() { get_libfn!("libstd.dylib", "println", my_println, (), str: &str); // 獲取dll的函數 // ^鏈接庫路徑 ^庫中的函數 ^調用的名稱 ^返回值 ^參數 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)
原文鏈接:https://juejin.cn/post/7142490653241540621
相關推薦
- 2022-07-11 Python內建屬性getattribute攔截器使用詳解_python
- 2022-11-26 詳解Python中的with語句和上下文管理器_python
- 2023-05-26 keras.layers.Layer中無法定義name的問題及解決_python
- 2022-06-26 ASP.NET?Core中間件會話狀態讀寫及生命周期示例_實用技巧
- 2022-07-18 Element-UI:el-table導出為excel
- 2022-09-26 Go常用技能日志log包創建使用示例_Golang
- 2022-04-04 Python?Opencv實現圖片切割處理_python
- 2022-09-05 python使用pip成功導入庫后還是報錯的解決方法(針對vscode)_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支