使用 bindgen 设置包含路径

Posted

技术标签:

【中文标题】使用 bindgen 设置包含路径【英文标题】:Setting the include path with bindgen 【发布时间】:2017-08-02 04:21:04 【问题描述】:

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

构建库似乎很容易;我选择使用来自build.rsgcc 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接口而不用大惊小怪,但它似乎没有设置包含路径的方法。

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

bindgen foo.h -- -I/path

【讨论】:

以上是关于使用 bindgen 设置包含路径的主要内容,如果未能解决你的问题,请参考以下文章

在包含空间的路径中使用 jar 设置 mapreduce.job.jar

如何使用 Emscripten 编译的程序中的 wasm-bindgen?

vc下DLL项目设置dll和lib库输出路径以及使用lib/dll库时的包含路径

怎么为QtCreator 添加包含路径

Cygwin:使用包含 Windows 路径的路径变量(其中包含空格)

如何通过 .htaccess 设置 PHP 包含路径?