簡體   English   中英

如何從 rust 調用 C++ Arduino 庫?

[英]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 有幫助配置bindgencc: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM