我试图使用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桥的部分,我将不胜感激。
1条答案
按热度按时间svgewumm1#
在
#[cxx::bridge]
模块中不提供impl
块。要从Rust中提供函数,您应该将声明放在模块中,但将定义放在父模块中。就像这样:你可以通过使用名为
self
的参数声明函数来做成员函数,从而使用impl Locations { }
块,但你不能提供C++静态成员函数/ Rust关联函数。请参阅this issue作为最好的参考,我发现该语法不受支持。你必须使用一个自由函数。