Dll rust库可以像c库那样从其他语言使用吗?
写这样的图书馆我要牺牲性病吗?例如,如果可能的话,我将如何向rust库编写python绑定 首先,向Rust指出要创建一个对C可见的函数:Dll rust库可以像c库那样从其他语言使用吗?,dll,rust,shared-libraries,Dll,Rust,Shared Libraries,写这样的图书馆我要牺牲性病吗?例如,如果可能的话,我将如何向rust库编写python绑定 首先,向Rust指出要创建一个对C可见的函数: #[no_mangle] pub extern "C" fn some_func() { ... } 这告诉Rust避免损坏输出符号并使用C ABI 接下来,在跨越边界时,需要使用C兼容类型。以下是一些对我有用的建议: 如果您计划将Rust结构作为不透明数据传递给C,它将传递回其他函数,则将其作为框返回,并将其作为&T或框返回。本质上,这意味着您将放弃R
#[no_mangle]
pub extern "C" fn some_func() { ... }
这告诉Rust避免损坏输出符号并使用C ABI
接下来,在跨越边界时,需要使用C兼容类型。以下是一些对我有用的建议:
- 如果您计划将Rust结构作为不透明数据传递给C,它将传递回其他函数,则将其作为
返回,并将其作为框
或&T
返回。本质上,这意味着您将放弃Rust中结构的所有权,并将所有权授予C代码。C代码必须确保,如果它将指针传递回接受一个框的函数,它将不再使用它框
- 如果您计划将一个Rust结构作为C结构传递给C,Rust可以方便地以C兼容的方式表示其结构。但是,您需要将放入这些结构中的值的类型限制为也具有兼容的C表示形式的类型。当然,数字类型和布尔值是安全的
- 您可以在下面的文档中看到更复杂类型(如向量和字符串)的表示形式。
和&str
表示为,而&T]
表示为Vec
- 您还可以将类型转换为
- 最后,您可能会发现自己需要直接使用指针。查看有用的API
core::raw::Vec
不是旧式~[t]
向量的表示吗?我认为Vec
property现在有一个不同的表示形式({length,capacity,pointer-to-array-of-T}
而不是pointer-to-length,capacity,array-of-acacacity Ts}
)。你能给出示例代码吗?我不太明白。我用Rust编写库,使一些函数类似于“C”,这些函数以后可以用来,比如说,制作python绑定,因为从python的角度来看,这些函数与普通的C函数没有什么区别,正确吗?因此使用一个pub extern
函数是安全的,它返回一个框
,然后从C代码接收与&T
/&mut T T
相同的值?不需要转换吗?(如果框
的内部表示实际上是一个零成本抽象,那么这是有意义的)。我想我还是试试看吧。