为Rust编写C库绑定的目的是什么?

And*_*öjt 11 rust

我的印象是,绑定是您编写的中间层,因此您可以在另一个应用程序中使用以一种语言编写的库.看起来Rust可能会以零开销调用C语言

对于一个具体的例子,福尔康是C API,但人们正在绑定工作福尔康(1,2,3).

如果可以直接从Rust调用C,为什么要创建绑定?我误解了什么吗?

Luk*_*odt 13

虽然Rust可以在没有开销的情况下调用C函数,但Rust编译器仍然需要知道这些函数的存在.要告诉编译器,您必须在extern "C" { .. }块中声明这些函数.您可以在Rust书FFI章节中阅读有关该主题的更多信息.对于许多人使用的C函数(例如Vulkan),将所有这些声明放入其他人可以使用的Rust库中是有意义的,而不是自己编写绑定.

使用上面提到的绑定,我们只是将原始C接口暴露给Rust程序员.但是大多数Rust程序员宁愿使用Rust中惯用的API(我们称之为"生锈").那就是:使用Rust的高级概念,如特征和闭包,以及"安全".

您链接的Vulkan库:

  • 所述第二链路是刚刚是利用工具(防锈定义BindGen)结合产生的原始.

  • tomaka库的目的是创建一个生锈的API,因此它不仅仅是函数声明的集合.tomaka选择引入非常少的开销来创建一个库,大多数Rust程序员使用它比C接口更舒服.(顺便说一下:tomaka也为OpenGL做了这个).

  • 我真的不知道您链接的第一个库,但我认为这是上述两种方法之间的关系.

  • 我总是把惯用的Rust代码称为"质朴",而不是"生锈".我认为它有更积极的内涵. (3认同)
  • 请注意,在Rust生态系统中正在开发一个约定:只需重新导出C API(未更改)的crate应该是名称`xxx-sys`,其中`xxx`是C库的名称.然后,可以在顶部构建多个更高级别的板条箱,从极简主义(仅强制执行内存安全)到更高级别的板条箱. (2认同)