Chromium で cxx を使用する
Chromium では、Rust を使用するリーフノードごとに独立した #[cxx::bridge] mod
を定義します。通常は、rust_static_library
ごとに 1 つずつになります。
cxx_bindings = [ "my_rust_file.rs" ]
# すべてのソースファイルではなく、#[cxx::bridge] を含むファイルのリスト
allow_unsafe = true
上記のコードを、crate_root
や sources
と並んで、既存の rust_static_library
ターゲットに追加するだけです。
C++ ヘッダーは適切な場所で生成されるため、次のようにインクルードできます。
#include "ui/base/my_rust_file.rs.h"
//base
には、Chromium C++ 型から CXX Rust 型(およびその逆方向)への変換を行うためのユーティリティ関数がいくつかあります(例: SpanToRustSlice
)。
受講者から、allow_unsafe = true
がなぜここでも必要なのかを尋ねられる可能性があります。
大まかに答えると、C/C++ コードは通常の Rust 標準では「安全」ではありません。Rust から C/C++ に行ったり来たりすると、メモリに対して任意の処理が行われ、Rust 独自のデータ レイアウトの安全性が損なわれる可能性があります。C/C++ の相互運用で unsafe
キーワードが多すぎると、unsafe
に対する注目度が薄れるので、これには 賛否両論があります。ただし厳密には、外部コードを Rust バイナリに取り込むと、Rust の観点からは想定していない動作が発生する可能性があります。
具体的な答えは、このページ の上部の図にあります。裏では、CXX は Rust の unsafe
関数と extern "C"
関数を生成します。これは前のセクションで手動で行ったのとまったく同じです。