🔗
FFI — RustからCライブラリを呼ぶ
extern "C"、bindgen、unsafeの実践的使い方
Rustエコシステムがいくら大きくなってもC/C++の既存ライブラリを全て代替はできない。SQLite、OpenSSL、libcurl — これらはRustから直接呼ぶ必要がある。
extern "C" {
fn strlen(s: *const c_char) -> usize;
}
let len = unsafe { strlen(c_str.as_ptr()) };
unsafeが必要な理由:C関数はRustの所有権/借用ルールに従わない。
bindgen — Cヘッダファイル(.h)を読んでRustバインディングコードを自動生成。
逆方向(RustをCから呼ぶ):#[no_mangle] pub extern "C" fn — VOICEVOX CoreがまさにこのパターンでPython EngineにC ABIを公開している。
キーポイント
1
extern "C"ブロックにC関数シグニチャを宣言
2
build.rsでCライブラリをリンク
3
unsafeブロックでC関数呼び出し — 安全性はプログラマが保証
4
安全なRustラッパー関数で包んでユーザーにsafe APIを提供
メリット
- ✓ C/C++エコシステムの全ライブラリをRustから使用可能
- ✓ unsafeをラッパーで包めば残りのコードは安全
デメリット
- ✗ unsafeコードの安全性はプログラマ責任
- ✗ CライブラリのビルD設定がプラットフォーム別に複雑
ユースケース
rusqlite — SQLite CライブラリのRustバインディング
VOICEVOX Core — RustをC ABIで公開、Pythonからctypesで呼び出し