Я сгенерировал привязки к Microsoft SEAL C ++ Library , используя инструмент rust-bindgen .
Моя конфигурация:
// 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");
ПЕЧАТЬПроект компилируется с использованием 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) с использованием static Метод получения ошибки сегментации (SIGSEGV: недопустимая ссылка), которая, как я выяснил после отладки с помощью gdb
, возникает при копировании указателя на пул памяти.
Мне удалось создать несколько обычных объектов (вещи, которые не имеют статического конструктора), но, похоже, они не работают для SEALContext, независимо от того, какие параметры я пробую.
Вы можете получить доступ к моему проекту seal-rs здесь .Все это в скрипте сборки и клонирует репозиторий, поэтому cargo test
должен собрать и воспроизвести ошибку.
Моя ОС - Archlinux 64bit, используется компилятор clang 7.