cargo install --force cbindgen
cbindgen --config cbindgen.toml --crate my_rust_library --output my_header.h
my_header.h 就是生成的头文件。extern crate cbindgen;
use std::env;
fn main() {
let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
cbindgen::Builder::new()
.with_crate(crate_dir)
.generate()
.expect("Unable to generate bindings")
.write_to_file("bindings.h");
}
bindings.h 就是我们要的 C 头文件。// trebuchet.rs
#[repr(u8)]
enum Ammo {
Rock,
WaterBalloon,
Cow,
}
#[repr(C)]
struct Target {
latitude: f64,
longitude: f64,
}
// notice: #[repr(rust)]
struct Trebuchet { ... }
#[no_mangle]
unsafe extern "C" fn trebuchet_new() -> *mut Trebuchet { ... }
#[no_mangle]
unsafe extern "C" fn trebuchet_delete(treb: *mut Trebuchet) { ... }
#[no_mangle]
unsafe extern "C" fn trebuchet_fire(treb: *mut Trebuchet,
ammo: Ammo,
target: Target) { ... }
// trebuchet.h
#include <cstdint>
#include <cstdlib>
extern "C" {
enum class Ammo : uint8_t {
Rock = 0,
WaterBalloon = 1,
Cow = 2,
};
struct Trebuchet;
struct Target {
double latitude;
double longitude;
};
void trebuchet_delete(Trebuchet *treb);
void trebuchet_fire(Trebuchet *treb, Ammo ammo, Target target);
Trebuchet* trebuchet_new();
} // extern "C"
原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。