亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  Rust學習資料

Rust學習資料

時間:2024-02-15

最近在研究Rust,目前大多數項目都可以使用Rust開發,但是涉及到和其他語言交互,比如用Rust開發一個SDK,一般還是需要導出C接口。


那如何將Rust導出C接口?

Rust的FFI就是專門做這件事的。一個正常的Rust public接口長這樣:

pub fn hello_world() -> i32 {    20}

如果要把一個Rust函數導出為C接口,需要對它進行改造:

#[no_mangle]pub extern "C" fn hello_world() -> i32 {    20}

它相比于純Rust函數有兩點不同:

一個是extern "C":表示導出C接口

一個是#[no_mangle]:正常一個C++或者Rust函數相關的符號都特別長且難以理解,使用它表示導出的符號是C符號,即沒有任何多余的修飾,函數名是啥樣,相關的符號大概就是啥樣,如圖:

如何導出C的動態庫或者靜態庫?

如果想要編譯出動態庫或者靜態庫,可以在Cargo.toml中配置crate-type:

[lib]crate-type = ["cdylib"] # Creates dynamic lib# crate-type = ["staticlib"] # Creates static lib

cylib表示導出動態庫,staticlib表示導出靜態庫。


如何生成對應的C頭文件?

一個C庫一般都有個頭文件,那Rust怎么生成一個C的頭文件呢?可以使用cbindgen:

cbindgen --config cbindgen.toml --crate hello_world --output hello_world.h

其中cbindgen.toml是一個template文件,我后面鏈接中列了具體地址。


上面的hello_world函數,我使用cbindgen就可以自動生成一個頭文件:

#pragma once
#include <stdarg.h>#include <stdbool.h>#include <stddef.h>#include <stdint.h>#include <stdlib.h>
#ifdef __cplusplusextern "C" {#endif // __cplusplus
int32_t hello_world(void);
#ifdef __cplusplus} // extern "C"#endif // __cplusplus

至于如何使用更復雜的類型和C交互,比如我想導出和傳入一個結構體的指針,比如我想設置const char*,以及怎么管理對應的內存?


可以直接看這段代碼:

use std::boxed::Box;use std::ffi::CStr;use std::ffi::CString;use std::os::raw::c_char;
pub struct Manager { path: CString,}
fn get_default_cstring() -> CString { CString::new("").expect("new string failed")}
#[no_mangle]pub extern "C" fn manager_create() -> *mut Manager { println!("{}", "create_manager().".to_string()); Box::into_raw(Box::new(Manager { path: get_default_cstring(), }))}
#[no_mangle]pub extern "C" fn manager_destroy(ptr: *mut Manager) { if ptr.is_null() { return; }
// safe unsafe { let _b = Box::from_raw(ptr); }}
impl Manager { #[no_mangle] pub extern "C" fn manager_set_path(&mut self, p: *const c_char) { unsafe { self.path = CString::from(CStr::from_ptr(p)); } }
#[no_mangle] pub extern "C" fn manager_get_function(&self) -> *const c_char { self.path.as_ptr() }}
#[no_mangle]pub extern "C" fn hello_world() -> i32 { 20}

也許有人不太理解Rust代碼的含義,那可以直接看它對應的C Header:

#pragma once
#include <stdarg.h>#include <stdbool.h>#include <stddef.h>#include <stdint.h>#include <stdlib.h>
typedef struct Manager Manager;
#ifdef __cplusplusextern "C" {#endif // __cplusplus
int32_t hello_world(void);
struct Manager *manager_create(void);
void manager_destroy(struct Manager *ptr);
const char *manager_get_function(const struct Manager *self);
void manager_set_path(struct Manager *self, const char *p);
#ifdef __cplusplus} // extern "C"#endif // __cplusplus

通過manager_create創建的內存,需要通過manager_destroy銷毀。


但是在對應的Rust代碼沒有用到申請或者銷毀內存相關的代碼,而是使用Box來管理內存,它可以理解為C++中的unique_ptr。


內存都通過對象來管理,避免Rust申請的內存,讓C這邊來釋放,違反代碼的開發準則。


當然,如果你非要在Rust層想malloc和free內存,可以使用libc的crate。


如果想在Rust中調用C或者C++代碼,可以使用cxx crate,也很方便,比如Rust中的String、Vec都在cxx中有對應的類型。


但是我的目的是使用Rust開發一個C的動態庫的SDK,兩種方法都嘗試了下,感覺還是直接使用FFI更方便些。


我這里特意整理了一些Rust FFI相關資料,感興趣的可以看看

  • Rust如何調用C接口、Rust如何導出C接口、C的callback如何傳給Rust:https://doc.rust-lang.org/nomicon/ffi.html

  • The Embedded Rust Book FFI:https://docs.rust-embedded.org/book/interoperability/rust-with-c.html

  • 使用cbindgen可以自動分析,將Rust接口導出為C接口:https://github.com/eqrion/cbindgen

  • cbindgen的default template:https://github.com/eqrion/cbindgen/blob/master/template.toml

  • cbindgen的doc:https://github.com/eqrion/cbindgen/blob/master/docs.md

  • Rust FFI的 example blog,主要是string如何傳出去并銷毀相關內存:https://snacky.blog/en/string-ffi-rust.html

  • cxx專用于Rust和C++之間的橋梁:https://github.com/dtolnay/cxx

  • cxx:https://cxx.rs/

  • Complex data types and Rust FFI blog:http://kmdouglass.github.io/posts/complex-data-types-and-the-rust-ffi/

  • Rust std ffi:https://doc.rust-lang.org/std/ffi/index.html

  • 與C交互時,可以使用libc在Rust層做C的malloc和free

  • 涉及ptr的地方需要了解:https://doc.rust-lang.org/std/ptr/index.html


還有些Rust入門資料

  • https://www.zhihu.com/question/31038569 

  • https://doc.rust-lang.org/rust-by-example/ 

  • https://doc.rust-lang.org/cargo/getting-started/installation.html 

  • https://github.com/rustlang-cn/Rustt 

  • https://github.com/sunface/rust-course 


更多內容在 一個優質的C++學習圈 里,來一起鉆研C++和Rust吧。

亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本久道久久综合中文字幕| 久久精品72免费观看| 亚洲天堂av在线免费| 欧美日韩一二区| 宅男精品视频| 国内精品久久久久久久影视蜜臀 | 亚洲欧美成人在线| 国模 一区 二区 三区| 欧美精品自拍| 韩国三级在线一区| 欧美精品三级日韩久久| 国产乱码精品1区2区3区| 欧美区一区二| 欧美日韩国产bt| 欧美阿v一级看视频| 国产乱人伦精品一区二区 | 亚洲国产1区| 久久久一本精品99久久精品66| 国产一区二区三区在线观看网站| 日韩亚洲欧美成人| 欧美日韩一区二区三区高清| 日韩午夜电影av| 国产精品视频久久| 韩国在线一区| 欧美视频在线观看视频极品| 久久天堂精品| 久久久久久久久蜜桃| 亚洲尤物在线| 亚洲免费福利视频| 亚洲国产欧美在线人成| 国产日韩精品在线观看| 欧美午夜激情视频| 欧美日韩国产黄| 欧美精品久久久久久久免费观看| 欧美在线免费看| 亚洲一区二区毛片| 亚洲青涩在线| 夜夜嗨av一区二区三区免费区| 亚洲第一搞黄网站| 亚洲经典自拍| 亚洲一区二区三区欧美| 国产目拍亚洲精品99久久精品 | 国产视频一区在线观看一区免费| 国产精品羞羞答答| 91久久香蕉国产日韩欧美9色 | 久久久欧美精品| 欧美怡红院视频| 久久久www成人免费毛片麻豆| 久久久水蜜桃av免费网站| 免费成人你懂的| 欧美日韩一区二区在线观看视频| 欧美网站在线| 精品91在线| 亚洲午夜高清视频| 久久在线免费| 国产欧美在线观看一区| 亚洲日本中文字幕区| 午夜精品区一区二区三| 欧美暴力喷水在线| 国产欧美欧美| 亚洲自拍都市欧美小说| 久久亚洲精品网站| 国产欧美不卡| 一区二区三区三区在线| 欧美成人蜜桃| 好吊色欧美一区二区三区四区| 99精品久久免费看蜜臀剧情介绍| 欧美在线三级| 国产伦精品一区二区三区免费| 亚洲精品日韩欧美| 欧美激情综合色综合啪啪| 娇妻被交换粗又大又硬视频欧美| 亚洲综合日韩| 国产精品国产| 亚洲——在线| 国产精品综合| 久久av一区| 国语精品中文字幕| 欧美一级视频一区二区| 国产亚洲一区二区三区在线观看| 中文国产一区| 国产精品天美传媒入口| 亚洲欧美日韩久久精品| 国产九色精品成人porny| 亚洲欧美国产日韩天堂区| 国产热re99久久6国产精品| 午夜天堂精品久久久久| 国产欧美日本一区二区三区| 久久激情网站| 亚洲精品国产拍免费91在线| 欧美日韩国产精品一区二区亚洲 | 国产精品久久久久久久久搜平片 | 在线一区二区日韩| 国产精品美女久久久久aⅴ国产馆| 亚洲一区二区黄色| 国产综合亚洲精品一区二| 欧美成人免费全部| 亚洲欧美日韩综合| 亚洲第一页在线| 国产精品久久久久免费a∨大胸 | 亚洲婷婷免费| 精品动漫3d一区二区三区免费 | 国产亚洲精久久久久久| 久久久久99精品国产片| 亚洲美女诱惑| 激情成人在线视频| 国产精品videosex极品| 久久久综合激的五月天| 中文国产亚洲喷潮| 一色屋精品视频在线观看网站| 欧美视频一区在线| 欧美精品一区二区视频| 久久国产精品一区二区| 99人久久精品视频最新地址| 在线 亚洲欧美在线综合一区| 国产精品区免费视频| 欧美三区免费完整视频在线观看| 亚洲精品久久久久中文字幕欢迎你| 欧美a一区二区| 亚欧成人精品| 中文在线不卡| 男人天堂欧美日韩| 亚洲欧美日韩国产一区| 日韩视频三区| 亚洲激情电影中文字幕| 一区在线播放| 黄色成人av网| 精品999成人| 亚洲国产日韩一区| 欧美日韩99| 国产精品超碰97尤物18| 欧美在线看片| 激情欧美国产欧美| 亚洲欧美日韩综合aⅴ视频| 欧美在线观看视频一区二区| 欧美阿v一级看视频| 国产精品免费小视频| 永久免费视频成人| 亚洲自拍电影| 久久这里只精品最新地址| 欧美激情综合色| 国产日韩欧美在线播放不卡| 亚洲成人在线免费| 日韩视频国产视频| 久久免费视频这里只有精品| 欧美日韩国产大片| 在线播放亚洲一区| 亚洲免费视频一区二区| 久久亚洲精品一区| 国产精品一区亚洲| 在线播放豆国产99亚洲| 亚洲在线中文字幕| 欧美精品免费观看二区| 亚洲高清一区二| 久久综合影视| 欧美日韩亚洲另类| 日韩视频免费看| 亚洲人体1000| 另类激情亚洲| 在线播放亚洲| 欧美成人免费在线观看| 国产亚洲福利| 久久成人18免费观看| 国产精品一卡二卡| 亚洲视频在线观看| 国产精品日韩欧美综合| 久久成人精品视频| 国产日韩精品一区二区浪潮av| 久久久精品2019中文字幕神马| 精品91在线| 欧美视频日韩视频| 久久精品人人爽| 99成人精品| 国模精品娜娜一二三区| 麻豆av福利av久久av| 一本一本久久a久久精品牛牛影视| 国产精品一区二区男女羞羞无遮挡 | 韩国av一区二区| 欧美日本韩国| 欧美一区二区精美| 一本色道**综合亚洲精品蜜桃冫| 国产亚洲一区二区三区在线观看| 欧美日韩日本网| 欧美不卡视频一区发布| 亚洲视频中文字幕| 在线一区二区三区四区| 欧美三级午夜理伦三级中文幕| 欧美777四色影视在线| 欧美一区二区视频97| 国产精品久久激情| 亚洲国产日韩一区| 国产精品久久久久久久久借妻| 欧美香蕉大胸在线视频观看| 国产视频丨精品|在线观看| 欧美成人精品不卡视频在线观看 | 国产日韩欧美在线一区| 亚洲国产第一页| 欧美国产日产韩国视频| 精品动漫3d一区二区三区| 久久一综合视频|