我正在编写一个 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
,但如果还有更好的方法,那似乎会有些混乱。