0Pricing
C++ Academy · レッスン

Rust FFI境界向けC++

RustからFFIで利用できるようC++関数を公開し、逆方向の連携も行います。

「Rust FFI境界向けC++」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

C++とRust

RustとC++はどちらもコンパイル型の低レベル言語ですが、ABIと型システムが異なり、互換性がありません。通常はC ABIブリッジを介して相互運用します。

RustからC++へ: extern "C"

extern "C"と#[no_mangle]を使ってRust関数をエクスポートします。

// Rust
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
    a + b
}

C++からRustを呼び出す

Rust関数をC++で宣言し、Rustの静的ライブラリとリンクします。

// C++
extern "C" int add(int a, int b);

std::cout << add(2, 3);

C++からRustへ

逆方向、つまりRustからC++を呼び出す場合です。C++をextern "C"でラップし、Rustで宣言します。

// C++
extern "C" int multiply(int a, int b) {
    return a * b;
}

// Rust
extern "C" {
    fn multiply(a: i32, b: i32) -> i32;
}

静的ライブラリのリンク

Rustクレートをstaticlibまたはcdylibとしてビルドし、C++のビルドとリンクします。

# Cargo.toml
[lib]
crate-type = ["staticlib"]

BindgenとCbindgen

FFI宣言を自動生成します。

  • bindgen — C++ヘッダーからRustバインディングを生成します
  • cbindgen — RustコードからC/C++ヘッダーを生成します

cxxクレート

cxxクレートは、より安全で高レベルなC++/Rust相互運用機能を提供します。共有スキーマを宣言すると、cxxが強い型付けを備えたバインディングを両側に生成します。

FFIを越えるメモリ所有権

どちらの言語にもRAIIがありますが、所有権モデルは異なります。所有するデータは値で渡し、借用データは生ポインタで渡します。そして、何を誰が解放するのかを文書化してください。

FFIを越える文字列

RustのStringとC++のstd::stringには互換性がありません。*const c_char(null終端)または(*const u8, usize)(ポインタと長さ)を使用します。

例外とパニック

RustのパニックとC++の例外は、FFIを安全に越えることができません。境界でC++の例外を捕捉し、Rust側ではstd::panic::catch_unwindを使用してください。

ビルド連携

メタビルドシステムを使用してください。たとえば、CMakeからCargoを呼び出す方法や、ビルドスクリプト(build.rs)を介してCargoからCMakeを呼び出す方法があります。cxx crateは一般的なパターンに対応しています。

実例

多くの実運用コードベースでは、C++とRustを組み合わせています。Mozilla FirefoxはC++エンジン内でRustコンポーネントを使用し、ChromiumはRustモジュールを試験的に導入しています。また、多くの暗号ライブラリが両方のバインディングを提供しています。

確認問題

C/C++からシンボルを見つけられるように名前修飾を無効にするRust属性はどれですか。

まとめ

C++とRustはC ABIを介して相互運用します。extern "C"と#[no_mangle]を使用してください。bindgenとcbindgenでバインディングを生成するか、より安全な型付きブリッジにはcxx crateを使用します。境界を越える際は、所有権、文字列、パニックを慎重に扱ってください。

よくある質問

「Rust FFI境界向けC++」レッスンは無料ですか?

はい。「Rust FFI境界向けC++」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「Rust FFI境界向けC++」で何を学びますか?

RustからFFIで利用できるようC++関数を公開し、逆方向の連携も行います。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Rust FFI境界向けC++」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. extern CとC ABI
  2. pybind11でC++からPythonを呼び出す
  3. Rust FFI境界向けC++
  4. SWIGによる多言語バインディング
← C++ Academyに戻る