如何从rust调用c++方法



我想从rust调用c++方法。我听说我需要创建vtables(VMT(,但我该怎么做呢?这和我做的有什么不同?

C++:

struct numbers {
int addnums(int a, int b) {
return a + b;
}
};
struct v_numbers {
virtual int v_addnums(int a, int b) {
return a + b;
}
};

锈蚀(错误,未链接(:

extern "system" {
fn addnums(a: i32, b: i32) -> i32;
fn v_addnums(a: i32, b: i32) -> i32;
}
fn main() {
unsafe {
println!("{}", addnums(1, 2));
println!("{}", v_addnums(1, 2));
}
}

对于那些评论道:我给你的例子是我试图做的事情的简化版本。我认为这个例子太简单了,人们会意识到它是某件事情的简化版。我很抱歉做出这样的假设。你知道,并不是所有的C++库都有";经典的C风格函数";。

但另一方面,你没有帮助我的意图,对吧?是的,显然我可以修改这个例子中的C++代码,但这样做有什么意义?我遇到了一个问题,我需要一个答案。我无法改变这个问题,因为那将是一个不同的问题。


我解决了它。它只适用于纯虚拟方法结构,但我只需要它们,所以,我很满意。

C++:

struct numbers {
virtual int addnums(int a, int b) {
return a + b;
}
};
extern "C" numbers* get_numbers() {
numbers* num = new numbers();
return num;
}

锈蚀:

#![allow(non_snake_case)]
extern "system" {
fn get_numbers() -> *mut usize;
}
#[repr(C)]
pub struct numbers_vtbl {
pub addnums: unsafe extern "system" fn(This: *mut numbers, a: i32, b: i32) -> i32,
}
#[repr(C)]
pub struct numbers {
pub lpVtbl: *const numbers_vtbl,
}
impl numbers {
#[inline]
pub unsafe fn addnums(&self, a: i32, b: i32) -> i32 {
((*self.lpVtbl).addnums)(self as *const _ as *mut _, a, b)
}
}
fn main() {
unsafe {
let a = get_numbers() as *mut numbers;
let b = (*a).addnums(14, 53);
println!("{}", b);
}
}

相关内容

最新更新