🔗

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で呼び出し