[英]How do I invoke a C++ Arduino library from rust?
有一段時間可以為 Arduino 和 Teensy 構建應用程序,用 Rust 編寫。
您可以找到外圍庫列表( https://github.com/rust-embedded/awesome-embedded-rust ),但是外圍設備太多,需要一段時間才能為不太常見的本地 Rust 實現編寫那些。
就我而言,我有 AdaFruit Neopixels。 There are a couple of C++ libraries for this ( https://github.com/Makuna/NeoPixelBus/wiki/Library-Comparisons ), but the only Rust library I could find is https://github.com/trezm/neopixel_rs which取決於路徑為../photon-hal
的板條箱,即使我刪除它,我也會在宏中得到編譯錯誤,這可能與用於編譯 C++ 元素的build.rs
有關。 我什至不確定它是否針對 Arduino。
是否有文檔概述了從 Arduino 交叉編譯 C++ 模塊,然后將其包裝在 RustA164742318714 中的正確過程
到目前為止,我已經開發了一個板條箱來幫助我為 C++ 庫編寫 Rust 包裝器。 rust-arduino-helpers是一個輔助函數庫,截至 2022 年 5 月,幾乎完全沒有文檔記錄。
rust-arduino-helpers
主要由rust-arduino-wrappers crate 的開發驅動,其中包含以太網、NeoPixel 和 PubSubClient(MQTT) 庫的包裝器。
第一步是build.rs
。 使用bindgen
將 C++ header 文件轉換為 Rust bindings.rs
。
然后編譯 C++ 庫源,以便可以在 rust 應用程序中包含該庫。 有時您會創建一個像src-cpp/multi.cpp
這樣的文件,其中#include
是庫的各種.cpp
文件。 或者,您可以將庫源文件作為單獨的 arguments 列出到cc:Build
object 的file()方法中。
rust-arduino-helpers
crate 有幫助配置bindgen
和cc:Build
的輔助方法。 然后創建一個src/raw.rs
包含類似
#![allow(non_snake_case, non_upper_case_globals, non_camel_case_types)]
#![allow(dead_code)]
#![allow(clippy::all)]
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
在raw.rs
文件中,您可以添加一點幫助代碼(有時是use
子句),但是您的大多數包裝器將 go 中的lib.rs
。 在這里,您將創建擁有引腳或其他設備的 Rust 包裝結構,並確保正確初始化和解除分配。
在有適當的文檔之前,檢查一些示例(例如ethernet/build.rs )可能會有所幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.