rust 在cxx桥中包括impl块

5sxhfpxr  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(129)

我试图使用cxx桥从C++调用一个rust库,但遇到了这个impl块,他们在演示代码中没有提到。
例如,当我试图在#[cxx::bridge]下的mod ffi{}中包含impl C和其中的函数时,会发生错误。当我尝试这个:#[cxx::bridge] mod ffi { impl C { fn func1 -> C;} } Cargo这样警告我:

error[cxxbridge]: expected an empty impl block
 ┌─ src/lib.rs:43:20
 │  

43 │       impl Locations {
     │ ╭────────────────────^
  44 │ │     /// Use the built-in cities.csv.
  45 │ │     pub fn from_memory() -> Locations {
  46 │ │         let mut records = Vec::new();
     · │
  77 │ │     }
  78 │ │     }
     │ ╰─────^ expected an empty impl block

如果我尝试包含空的impl块C:#[cxx::bridge] mod ffi { impl C {} } Cargo警告:

error[cxxbridge]: unsupported Self type of explicit impl
 ┌─ src/lib.rs:43:5
 │

 43 │     impl Locations {}
     │     ^^^^^^^^^^^^^^^^^ unsupported Self type of explicit impl

由于我是Rust的新手,我试图忽略这个impl块,并将其中的所有函数包含在mod ffi{}中,但Cargo也拒绝了这样的做法:

error[E0425]: cannot find function `from_memory` in module `super`
  --> src/lib.rs:47:12
   |
47 |         fn from_memory() -> Locations;
   |            ^^^^^^^^^^^ not found in `super`

For more information about this error, try `rustc --explain E0425`.

这是图书馆的网址lib.rs

#[cxx::bridge]
mod ffi{ struct A { // some code }
 struct B<'a> { // some code }
struct C { //some code }
struct D<'a> { // some code }
extern "Rust" {} } //this part is what I'm writing now 

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct A { // some code }
#[derive(Debug, Serialize, Clone)]
pub struct B<'a> { // some code }
pub struct C { member: xx, }
impl C { pub fn func1() -> C { //some code
C { member } } }
pub struct D<'a> { // some code }
impl<'a> D<'a> { //some code }

#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test() { //some code }

如果有人能给我一些草图来填补cxx桥的部分,我将不胜感激。

svgewumm

svgewumm1#

#[cxx::bridge]模块中不提供impl块。要从Rust中提供函数,您应该将声明放在模块中,但将定义放在父模块中。就像这样:

#[cxx::bridge]
mod ffi {
    struct Locations { /* some code */ }

    extern "Rust" {
        from_memory() -> Locations; // this declaration
    }
}

fn from_memory() -> Locations { // will use this definition
    todo!("put your implementation here");
}

你可以通过使用名为self的参数声明函数来做成员函数,从而使用impl Locations { }块,但你不能提供C++静态成员函数/ Rust关联函数。请参阅this issue作为最好的参考,我发现该语法不受支持。你必须使用一个自由函数。

相关问题