Closed3
Rustを使ってSourceModのextensionを記述したかった
C++のヘッダーファイルからRustのバインディングを作成する場合、以下のツールが候補となりそう。
- bindgen
- cxx
- autocxx
それぞれ試したが、今回はbindgenが直感的に扱えて便利だったので、bindgenを使用する。
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にクローズされました