互操作性
Rust与C代码之间的互操作性始终取决于两种语言之间的数据转换。为此,在stdlib中有两个专用模块称为std::ffi和std::os::raw。
std::os::raw处理可以由编译器隐式转换的低级基本类型,因为Rust和C之间的内存布局足够相似或相同。
std::ffi 提供了一些实用程序,用于转换更复杂的类型(例如字符串),将&str和String都映射到更易于处理和更安全的C类型。
这两个模块都不在core中,但您可以在cstr_corecrate中找到支持#![no_std]的std::ffi::{CStr,CString},std::os::raw中的大多数类型可以在cty crate中找到。
| Rust类型 | 中间类型 | C类型 |
|---|---|---|
| String | CString | *char |
| &str | CStr | *const char |
| () | c_void | void |
| u32 or u64 | c_uint | unsigned int |
| etc | ... | ... |
如上所述,基本类型可以由编译器隐式转换。
unsafe fn foo(num: u32) {
let c_num: c_uint = num;
let r_num: u32 = c_num;
}
与其他构建系统的互操作性
嵌入式项目中经常会碰到需要Cargo与现有的构建系统(例如make或cmake)结合的情况。
问题# 61上有我们收集的示例。
与RTOS的互操作性
将Rust与FreeRTOS或ChibiOS等RTOS集成仍在进行中。特别是从Rust调用RTOS函数可能很棘手。
问题# 62上有我们收集的示例。