使用bindgen设置包含路径

31

我正在编写一个 Rust 接口,连接到 一个小型的 C 库,该库的头文件分散在几个位置。这不是一个系统库,通常由同一软件包中的某些可执行文件使用。我目前将其作为 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库来生成FFI接口而不需要太多麻烦,但它似乎没有设置包含路径的方法。

我可以像这篇博客建议的那样创建一个wrapper.h并包含几个头文件,但如果dir1/dir1.h直接包含conf.h(由于.include("external/foo/config_a/")在构建时有效),则无法找到它。

我在bindgen的API中找不到任何有助于解决这个问题的选项(实质上我想传递相当于gcc/clang的-I选项)。我有什么遗漏的吗?

目前我能想到的最好的选择是将库源代码中的各个头文件复制到build.rs中的某个临时目录中,并在该目录上运行bindgen,但如果还有更好的方法,那似乎会有些混乱。

1个回答

39

通过API,您可以使用Builder::clang_arg方法来传递任意参数:

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

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

bindgen foo.h -- -I/path

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接