问题标签 [bindgen]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
680 浏览

c - Rust 调用 C,C 代码中的静态 const

我已经使用 rust-bindgen 来生成 rust 接口代码。

现在在 C 代码中,您可以找到以下内容:

请注意,在孔中其余代码_mps_key_ARGS_END不会再次出现。

宏 MPS_KEY_ARGS_END 经常在其他 simular中使用mps_key_s

现在 rust-bindgen 生成的代码是这样的:

现在在 C 代码中,这是一个示例用法:

在 rust 中,它看起来像这样:

现在我试着这样称呼它:

但我得到一个错误:

错误:不匹配的类型:预期*const Struct_mps_key_s,找到 Struct_mps_key_s(预期 *-ptr,找到枚举 Struct_mps_key_s)

我不是一个优秀的 C 程序员,我什至不明白这些 C 静态甚至从哪里获得值。

谢谢你的帮助。

编辑:

根据 Chris Morgan 的回答进行更新。

我添加了这段代码(注意,我用 mps_key_t 替换了 *const mps_key_s):

只是关于我为什么mps_key_t在 C 中使用 , 的一些额外信息:

生锈:

这个接缝接缝比以前更好,但现在我遇到了严重的崩溃:

错误:内部编译器错误:意外失败注意:编译器遇到了意外的失败路径。这是一个错误。注意:我们将不胜感激错误报告: http ://doc.rust-lang.org/complement-bugreport.html注意:运行 RUST_BACKTRACE=1回溯任务“rustc”在“预期项目”失败,发现外部项目_mps_key_ARGS_END::_mps_key_ARGS_END (id=1102)', /home/rustbuild/src/rust-buildbot/slave/nightly-linux/build/src/libsyntax/ast_map/mod.rs:327

0 投票
0 回答
407 浏览

windows - 在 Windows 系统上使用 Bindgen 时如何找到 Oracle 的“oci.h”标头?

我尝试使用bindgen自动生成 Rust FFI 绑定到 C 和 C++ 库,用于 Oracle 数据库的 OCI 绑定。

我遵循bindgen用户指南,我这样做了:

我的 Oracle 客户端 SDK 路径为E:/Rust/instantclient_11_2,活动工具链为nightly-x86_64-pc-windows-msvc文件wrapper.h为:

当我运行时cargo build,我收到以下错误:

如果我在 Ubuntu 16.04 上执行相同的操作,它会成功,但我不知道如何在 Windows 系统上执行此操作。

0 投票
1 回答
638 浏览

rust - Bindgen 跳过 C++ 头文件中的定义

我正在尝试为SEAL C++ library编译绑定。这是我的回购

bindings.rs 没有来自defaultparams.h的任何内容

我必须向 Builder 对象添加什么才能在生成的绑定中包含defaultparams.h的函数?我需要coeff_modulus_128()例如。

我尝试将其列入白名单,std::vector但它对生成的绑定没有任何影响。

0 投票
1 回答
233 浏览

c++ - rust-bindgen 绑定引发 SIGSEGV

我使用rust-bindgen工具生成了与Microsoft SEAL C++ 库的绑定。

我的配置:

SEAL 项目是使用cc-rs使用以下配置编译的:

但之后,当使用静态方法创建一个新的上下文(这主要是 SEAL 特定的)时,我得到一个分段错误(SIGSEGV:无效引用),我在调试后发现gdb它来自复制指向内存池的指针。

我能够实例化多个常规对象(没有静态构造函数的东西),但无论我尝试什么参数,它似乎都不适用于 SEALContext。

您可以在此处访问我的项目seal-rs。整个过程都在构建脚本中并克隆了 repo,因此cargo test应该构建并重现错误。

我的操作系统是 Archlinux 64bit,使用的编译器是 clang 7。

0 投票
0 回答
306 浏览

rust - 如何将 Bindgen 生成的静态全局变量转换为全局常量?

Bindgen 从static constC 风格的全局结构生成它:

我想安全地将它绑定到constRust 中的全局变量。

到目前为止我最好的尝试是

我收到以下编译错误:

我该怎么办?

0 投票
1 回答
197 浏览

c - 使用 bindgen 绑定基于 TPM 的服务的 tbs.h 时出现“未知类型名称”

我正在尝试tbs.h通过 rust-bindgen 绑定(基于 TPM 的服务)。

我有以下标题:

build.rs文件包含 Windows SDK 包含目录的路径:

当我尝试通过创建绑定cargo build并运行构建脚本时,出现以下错误:

是否缺少一些clang配置?

0 投票
1 回答
134 浏览

c - 如何使用 rust bindgen 为 postgresql 后端创建 Rust 绑定?

我制作了一个带有标准 lib.rs 的 Cargo 包,一个带有 under 的 Cargo.toml,一个带有bindgen = "0.59"under[build-dependencies]的 wrapper.h#include "rewrite/rewriteDefine.h"和一个 build.rs,如下所示:

我在提交3779ac62d709467fe6331c8f0285d42e7487a01c和 clang 12.0.1、cargo 1.53.0(4369396ce 2021-04-27)和 rustc 1.53.02021 -06-17) 安装。

运行货物构建:

绝对路径:/home/manbearpig/Documents/postgresql/src/include给出与相对路径相同的错误。

一些未知类型名称位于postgresql/src/include/c.h. 我认为它们是使用来自postgresql/src/include/pg_config.h.

在包含文件夹输出中运行bindgen c.h,例如:pub type uint32 = ::std::os::raw::c_uint;.

添加#include <stdbool.h>到 wrapper.h 会替换../postgresql/src/include/storage/itemptr.h:203:8: error: unknown type name 'bool', err: true为另一个错误。

0 投票
0 回答
59 浏览

rust - 如何只能通过 bindgen 生成 #[derive(Clone)]?

我正在使用 bindgen 生成具有以下配置的代码。

但是我发现生成的代码像

我想知道是否有任何方法我只能生成#[derive(Clone)]而不生成[derive(Copy)]

0 投票
0 回答
42 浏览

rust - 如何避免在 bindgen 中使用生锈枚举的未定义行为?

bindgen有一个选项可以从 C 枚举生成 Rust 枚举(而不是常量)。但是,文档声明它能够生成在某些情况下调用未定义行为的代码:

请谨慎使用,在不安全的代码(包括 FFI)中使用无效值创建它会调用未定义的行为。您可能想改用 newtype 枚举样式。

为了避免这种情况,我究竟应该注意什么?“在不安全的代码中创建它”是否意味着build.rs没有不安全代码的 a 会捕获这些情况?上面引用的意思我不清楚。

0 投票
2 回答
31 浏览

rust - 尝试通过 cargo fix 更新版本时未找到本地 crate

上下文:
我有一个名为“libmaths”的本地 C 库,然后使用 Bindgen 创建一个“libmaths-sys”包,该包在本地存储在与我的项目相同的目录中。

问题:
我想使用 2021 版 Rust 中的一些功能,目前我的项目是在 2018 年构建的。我正在尝试按照以下说明更新项目:

https://doc.rust-lang.org/cargo/commands/cargo-fix.html

运行 cargo fix --edition。如果您的项目具有多个功能,还可以考虑使用 --all-features 标志。如果您的项目具有由 cfg 属性控制的特定于平台的代码,您可能还希望使用不同的 --target 标志多次运行 cargo fix --edition。

修改 Cargo.toml 以将 edition 字段设置为新版本。

运行您的项目测试以验证一切仍然有效。如果发出新警告,您可能需要考虑再次运行 cargo fix(不带 --edition 标志)以应用编译器给出的任何建议。

要运行 cargo fix --edition,编译器告诉我删除 cargo toml 中的 edition="2018"。在此之后,我收到一个编译错误,指出找不到 libmaths-sys。代码在 2018 年编译和执行正常,但不是没有这个版本标签。

我找不到任何有类似问题的人,这是我的第一个 stackoverflow 问题,所以不确定如何最好地显示我的代码,因为它是一个小项目的上下文。

错误代码

文件结构和项目概述

libmaths包含返回a + b的add.c和返回a - b的subtract.c,头文件add.h指向两个.c文件

bindgen 生成的 Rust 代码通过 libmath-sys 板条箱中的 lib.rs 附加,该板条箱链接到我从树中省略的 OUT DIR 以保存 200 行文件名。