我使用rust-bindgen工具生成了与Microsoft SEAL C++ 库的绑定。
我的配置:
// Generate the bindings
let bindings = bindgen::Builder::default()
.generate_inline_functions(true)
.derive_default(true)
.header("./seal/src/seal/seal.h")
.clang_arg("-I./seal/src/")
.clang_arg("-std=c++17")
.clang_arg("-x")
.clang_arg("c++")
.opaque_type("std::.*")
.whitelist_type("seal::.*")
.whitelist_function("seal::.*")
.generate()
.expect("Unable to generate bindings");
SEAL 项目是使用cc-rs使用以下配置编译的:
let mut build = cc::Build::new();
build.cpp(true);
build.flag_if_supported("-std=c++17");
build.flag_if_supported("-march=native");
build.flag_if_supported("-fkeep-inline-functions");
build.flag_if_supported("-fno-inline-functions");
let base_path = Path::new("./seal/src/seal/");
let util_base_path = Path::new("./seal/src/seal/util/");
add_cpp_files(&mut build, base_path);
add_cpp_files(&mut build, util_base_path);
build.include("./seal/src");
build.compile("seal");
但之后,当使用静态方法创建一个新的上下文(这主要是 SEAL 特定的)时,我得到一个分段错误(SIGSEGV:无效引用),我在调试后发现gdb
它来自复制指向内存池的指针。
我能够实例化多个常规对象(没有静态构造函数的东西),但无论我尝试什么参数,它似乎都不适用于 SEALContext。
您可以在此处访问我的项目seal-rs。整个过程都在构建脚本中并克隆了 repo,因此cargo test
应该构建并重现错误。
我的操作系统是 Archlinux 64bit,使用的编译器是 clang 7。