可以用c库的方式从其他语言中使用生锈库吗?

时间:2014-05-21 10:52:39

标签: dll rust shared-libraries

写这样的图书馆我必须牺牲标准吗?例如,如果可能的话,我会如何编写python绑定到rust库?

1 个答案:

答案 0 :(得分:41)

首先,向Rust表明你想要创建一个对C:

可见的函数
#[no_mangle]
pub extern "C" fn some_func() { ... }

这告诉Rust避免修改输出符号并使用C ABI。

接下来,您需要在越过边界时使用C兼容类型。以下是一些对我有用的建议:

  • 如果您计划将Rust结构作为不透明数据传递给C,它将传递回其他函数,将其作为Box<T>返回,并将其作为&T或{{ 1}}。从本质上讲,这意味着您放弃了Rust中结构的所有权,并赋予C代码所有权。 C代码必须确保如果它将指针传回一个带有Box的函数,它不再使用它
  • 如果您计划将Rust结构作为C结构传递给C,Rust会以C兼容的方式方便地表示其结构。但是,您需要将放在这些结构中的值的类型限制为也具有兼容C表示的类型。当然,数字类型和布尔值是安全的。
  • 您可以在core::raw下的文档中看到更复杂类型(如vecs和字符串)的Rust表示。 Box<T>&str表示为raw::Slice,而&[T]表示为raw::Vec
  • 您还可以将类型转换为libc::types
  • 最后,您可能会发现自己需要直接使用指针。查看std::mem了解有用的API。