RustはオーバーヘッドなしでCの関数を呼び出すことができますが、Rustコンパイラはこれらの関数の存在を知る必要があります。コンパイラに指示するには、これらの関数をブロックextern "C" { .. }
に宣言する必要があります。トピックについて詳しくは、FFI chapter of the Rust bookをご覧ください。多くの人(例えばVulkan)が使用するC関数の場合、バインディング自体を記述するのではなく、他の人がちょうど使用できるRustライブラリにすべての宣言を入れるのが理にかなっています。
上記のバインディングを使用すると、元のCインターフェイスがRustプログラマに公開されます。しかし、ほとんどのRustプログラマーは、Rustで慣用的なAPI(「錆びた」と呼んでいる)を使いたいと思っています。つまり、Rustの高水準の概念を使用して、特性やクロージャーを使い、「安全」であることです。
リンクされたバルカンライブラリ:
secondリンクはただのツール(さび-bindgen)で生成された生結合です。
tomaka's libraryの目的は、錆びたAPIを作成することであり、単なる関数宣言の集合ではありません。 tomakaは、ほとんどのRustプログラマがCインタフェースよりも使いやすいライブラリを作成するために、ほとんどオーバーヘッドを導入しないことを選択します。 (ところで:tomakaはこれをやったfor OpenGL)。
あなたがリンクした最初のライブラリについて実際には分かりませんが、私はそれが上記の2つのアプローチの間にあると思います。
ランタイムオーバーヘッドがゼロのCをコールしても、すぐにC関数を呼び出すことはできません。 RustはCヘッダを自動的にインポートすることができないので(Swiftなどとは異なり)、Rustの各関数の宣言を手動で書き直してRustから呼び出し可能にする必要があります。 – hamstergene
@Shepmasterはここにポイントがあります。たぶんあなたは、質問を「Vulkanの例のCustinのCustバインディングの目的は何ですか?」というように変更することができます。 –
@hamstergeneまたはvk.xmlを使用して関数シグネチャを生成します。 –