使用bindgen

时间:2017-03-11 23:15:45

标签: rust ffi

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

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

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接口而不用太大惊小怪,但它似乎没有办法设置包含路径。

我可以按照this blog的建议创建wrapper.h并添加多个标题,但如果dir1/dir1.h直接包含conf.h,那么在.include("external/foo/config_a/")构建时它无法找到。

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

到目前为止,我能想到的最佳选择是将库源中的各种标题复制到build.rs中的某个临时目录中,并在其上运行bindgen,但如果有的话,这似乎有些混乱更好的方式。

1 个答案:

答案 0 :(得分:10)

使用API​​,您可以将Builder::clang_arg与任意参数一起使用:

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

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

bindgen foo.h -- -I/path