我正在尝试使用Rust的build.rs代码包装一个C库。在configure阶段,可以设置一堆标志,比如MAX_LEVEL=5,DERIVATION=2。在这种情况下,脚本将在C代码中生成一个指针到函数的数组。
#define MAX_LEVEL 5
void (*evaluate_level[MAX_LEVEL])(/* args */);
void (*derivation_1[MAX_LEVEL])(/* args */);
void (*derivation_2[MAX_LEVEL])(/* args */);其中,级别i值是通过调用evaluate_level[i](&arg)来计算的,而一阶/二阶派生是使用derivation_1[i](&arg)和derivation_2[i](&arg)计算的。可以通过增加DERIVATION和重新编译库来支持高阶派生。
现在在我的锈蚀包装里,lib.rs,我想
pub fn get_max_level() -> u32 { 5 }.
MAX_LEVEL设置为5,例如在某个地方创建pub const MAX_LEVEL: u32 = 5;语句;或者,有一个板条箱函数MAX_LEVEL生成derivation代码。
#[repr(C)]
pub struct EvaluateArg(/* private fields */);
const DERIVATION: [fn(u32, *mut EvaluateArg); 2] = [/* ... */];或拥有
pub const MAX_DERIVATIONS: u32 = 2;
pub fn derivation_1(level: u32, arg: &mut EvaluateArg);
pub fn derivation_2(level: u32, arg: &mut EvaluateArg);使用宏或其他方式,例如手动生成代码?
通过某种方式设置build.rs可以做到这一点吗?
发布于 2022-11-27 04:35:02
正如注释中所提到的那样,标准库bindgen将通过clang解析C++头文件,并生成相应的绑定Rust代码。
https://stackoverflow.com/questions/74566632
复制相似问题