Closed3

Rustを使ってSourceModのextensionを記述したかった

FlowingSPDGFlowingSPDG

C++のヘッダーファイルからRustのバインディングを作成する場合、以下のツールが候補となりそう。

  • bindgen
  • cxx
  • autocxx

それぞれ試したが、今回はbindgenが直感的に扱えて便利だったので、bindgenを使用する。

FlowingSPDGFlowingSPDG

bindgenで、以下のbuild.rsを使ったが、エラーが発生して正しく生成されなかった。

fn main() {
    // Tell cargo to look for shared libraries in the specified directory
    println!("cargo:rustc-link-search=/mnt/c/Users/Flowing/Documents/GitHub/sourcemod-sample-ext-zig/sdk");

    // Tell cargo to tell rustc to link the system bzip2
    // shared library.
    println!("cargo:rustc-link-lib=smsdk_ext");

    // Tell cargo to invalidate the built crate whenever the wrapper changes
    println!("cargo:rerun-if-changed=sdk/inc.h");

    // The bindgen::Builder is the main entry point
    // to bindgen, and lets you build up options for
    // the resulting bindings.
    let bindings = bindgen::Builder::default()
        // The input header we would like to generate
        // bindings for.
        .header("sdk/inc.h") // エントリーポイントとなるヘッダーの指定
        // tell clang to use c++
        .clang_arg("-x").clang_arg("c++") // このオプションを付けるとclangがC++で動く
        // clangにインクルードパスを指定する
        .clang_arg("-I/mnt/c/Users/Flowing/Documents/GitHub/sourcemod-sample-ext-zig/sm_ext_rust/sdk/sourcemod/public")
        .clang_arg("-I/mnt/c/Users/Flowing/Documents/GitHub/sourcemod-sample-ext-zig/sm_ext_rust/sdk/sourcepawn/include")
        .clang_arg("-I/mnt/c/Users/Flowing/Documents/GitHub/sourcemod-sample-ext-zig/sm_ext_rust/sdk/amtl")
        // Tell cargo to invalidate the built crate whenever any of the
        // included header files changed.
        .parse_callbacks(Box::new(bindgen::CargoCallbacks))
        // Finish the builder and generate the bindings.
        .generate()
        // Unwrap the Result and panic on failure.
        .expect("Unable to generate bindings");

    // Write the bindings to the $OUT_DIR/bindings.rs file.
    bindings
        .write_to_file("src/bindings.rs")
        .expect("Couldn't write bindings!");
}

発生したエラー:

flowing@DESKTOP-BUIITN0:/mnt/c/Users/Flowing/Documents/GitHub/sourcemod-sample-ext-zig/sm_ext_rust$ cargo build
   Compiling sm_ext_rust v0.1.0 (/mnt/c/Users/Flowing/Documents/GitHub/sourcemod-sample-ext-zig/sm_ext_rust)
error[E0428]: the name `iterator` is defined multiple times
     --> src/bindings.rs:22035:1
      |
22033 | pub type iterator = std__Bit_iterator;
      | -------------------------------------- previous definition of the type `iterator` here
22034 | pub type size_type = usize;
22035 | pub type iterator = std__Bit_iterator;
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `iterator` redefined here
      |
      = note: `iterator` must be defined only once in the type namespace of this module

error[E0412]: cannot find type `_Tp` in this scope
    --> src/bindings.rs:6333:27
     |
6333 |     pub static std_value: _Tp;
     |                           ^^^ not found in this scope

error[E0412]: cannot find type `_Value` in this scope
     --> src/bindings.rs:12227:33
      |
12227 |     pub static __gnu_cxx___min: _Value;
      |                                 ^^^^^^ not found in this scope

error[E0412]: cannot find type `_Value` in this scope
     --> src/bindings.rs:12231:33
      |
12231 |     pub static __gnu_cxx___max: _Value;
      |                                 ^^^^^^ not found in this scope

Some errors have detailed explanations: E0412, E0428.
For more information about an error, try `rustc --explain E0412`.
error: could not compile `sm_ext_rust` (lib) due to 4 previous errors
flowing@DESKTOP-BUIITN0:/mnt/c/Users/Flowing/Documents/GitHub/sourcemod-sample-ext-zig/sm_ext_rust$

調べてみたところ、bindgen自体がC++のテンプレート機能には対応していないらしい。
軽く調整して直せないか試してみたが、簡単な手直しで直せるレベルではない予感がする。
Zigの件と続き、疲れたのでいったん休憩してまた時間を取って試してみる。

このスクラップは2023/09/26にクローズされました