rust - 使用 bindgen 设置包含路径

标签 rust ffi

我正在为 a small C library 编写一个 Rust 接口(interface),它的标题分布在几个位置。它不是系统库,通常由同一包中的某些可执行文件使用;我目前将它作为一个 git 子模块包含在我的 Cargo 项目中。

构建库似乎很容易;我选择使用 build.rs 中的 gcc crate:

gcc::Config::new()
            .file("external/foo/dir1/file1.c")
            .file("external/foo/dir2/file2.c")
            .include("external/foo/dir1/")
            .include("external/foo/dir2/")
            .include("external/foo/config_a/")
            .compile("libfoo.a");

现在我希望使用 bindgen crate 生成 FFI 接口(interface)没有太多大惊小怪,但它似乎没有设置包含路径的方法。

我可以按照 this blog 的建议创建一个 wrapper.h并包含几个 header ,但如果 dir1/dir1.h 直接包含 conf.h,由于 .include("external/foo/config_a/") 找不到。

我在 bindgen 的 API 中找不到任何帮助(基本上我想传递 gcc/clang 的 -I 选项的等价物)。我错过了什么吗?

到目前为止,我能想到的最佳选择是将库源中的各种 header 复制到 build.rs 中的某个临时目录中,然后在其上运行 bindgen,但如果有更好的方法,那似乎有点困惑。

最佳答案

通过 API,您可以使用 Builder::clang_arg带有任意参数:

let b = bindgen::builder().header("foo.h").clang_arg("-I/path");

在命令行中,您可以通过在 -- 之后附加参数来执行相同的操作,例如:

bindgen foo.h -- -I/path

关于rust - 使用 bindgen 设置包含路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42741815/

相关文章:

PyFile_AsFile 的 Python 3 替代品

python - 尝试释放 CString 数组时发生内存泄漏

rust - 有没有办法在命令行上做类似 #![allow(unstable)] 的事情?

haskell - 对 LLVM 的外部导入 prim 调用

rust - 强制jlrs使用较新的bindgen?

rust - 借的时候值(value)暂时下降,但我不想出租

c - 从 Rust 到 C 的原始指针变为空

racket - Racket 和花栗鼠的 FFI 问题

unit-testing - 如何编写 Rust 单元测试以确保发生 panic ?

rust - 是否可以覆盖 Rust 中的默认特征实现?