Dll 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

写这样的图书馆我要牺牲性病吗?例如,如果可能的话,我将如何向rust库编写python绑定

首先,向Rust指出要创建一个对C可见的函数:

#[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

简短版本:它和C一样好,在大多数地方都更好。我不太适合编写长版本,但我已经ping过一位使用Ruby/Rust interop(例如Yehuda Katz)的人。虽然结构目前在布局上与C兼容,但默认情况下,它们不会持续太久。
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
相同的值?不需要转换吗?(如果
的内部表示实际上是一个零成本抽象,那么这是有意义的)。我想我还是试试看吧。