2017-03-11 106 views
1

我正在写一个Rust接口到a small C library,它有几个位置的标头。它不是一个系统库,通常由同一个包中的一些可执行文件使用;我目前在我的Cargo项目中将它作为git子模块加入。使用bindgen设置包含路径

建立图书馆似乎很容易;我选择使用从build.rsgcc箱:

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箱产生没有太多做文章FFI接口,但它似乎并不具有设置的一种方式包括路径。

我可以创建一个wrapper.h通过this blog的建议,其中包括几个头,但如果dir1/dir1.h包括conf.h直接,其建筑物因.include("external/foo/config_a/")时,它无法找到工作。

我找不到bindgen的API来帮助这里(实质上我想通过相当于gcc/clang的-I选项)。我错过了什么?

我能想到的迄今为止最好的选择是不同的头从库源拷贝到某个临时目录中build.rs和运行上bindgen,但似乎有点混乱,如果有一个更好的方式。

回答

3

有了可以使用Builder::clang_arg任意参数的API:

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

在命令行中,你可以通过附加参数--后做同样的,如:

bindgen foo.h -- -I/path