【问题标题】:Rust bindgen ignore include specific include from header fileRust bindgen 忽略包含头文件中的特定包含
【发布时间】:2021-09-19 01:06:49
【问题描述】:

我有一个头文件,可以说是 greetings.h:

include <hello.h>;
include <bye.h>;
include <hola.h>;
...

我在 rust 中使用 bindgen 将这些文件从 c 头文件生成到 rust 文件中。 但我想忽略生成include &lt;hola.h&gt; 标头并仅使用helllo.hbye.h 生成greeting.h。 我在 docs.rs bindgen 文档中搜索了它,但没有找到任何提示。 或者有没有任何选项可以用clang做到这一点

【问题讨论】:

  • 在您的 build.rs 文件中使用 allowlistingblocklisting 来指定要为库的哪些部分生成绑定,更多信息请参见 @987654321 @.
  • @HHK 谢谢我用允许列表功能解决了这个问题
  • allowlistingblocklisting 功能对我来说已经完成了一半。我真正希望的是完全禁止bindgen(而且,我真的猜是bindgen 下面的clang)处理某些#include 的头文件。我想这可能意味着改变原始的 C 头文件。

标签: rust clang rust-bindgen


【解决方案1】:

我能够通过猜测我试图从 c 绑定到 rust 的库是“命名空间”来解决这个问题,在 C 语言中实际上没有命名空间,但是编写开源代码的人倾向于在他们的代码前面加上“一些前缀*”。 因此,如果我要绑定的 h 文件如下所示:

mylib.h:

include <hello.h>;
include <bye.h>;
include <hola.h>;
...

mylib_add_value(...);
mylib_remove_value(...);
mylib_display_value(...);
...

我不希望生成 hola.h, 我可以使用 bingden 的允许和阻止功能过滤输出,例如:

build.rs:

fn main() {
    // Tell cargo to tell rustc to link the system nvpair of zfs
    // shared library.
    println!("cargo:rustc-link-lib=mylib");

    // The bindgen::Builder is the main entry point
    // to bindgen, and lets you build up options for
    // the resulting bindings.
    let bindings = bindgen::Builder::default()
        // The input header we would like to generate
        // bindings for.
        .header("wrapper.h")
        .allowlist_var(r#"(\w*mylib\w*)"#)
        .allowlist_type(r#"(\w*mylib\w*)"#)
        .allowlist_function(r#"(\w*mylib\w*)"#)
        .blocklist_item(r#"(\w*hola\w*)"#)
        .blocklist_type(r#"(\w*hola\w*)"#)
        .blocklist_function(r#"(\w*hola\w*)"#)
        .clang_args(vec!["-I/usr/include/mylib"])
        .default_enum_style(bindgen::EnumVariation::Rust {
            non_exhaustive: (true),
        })
        // Finish the builder and generate the bindings.
        .generate()
        // Unwrap the Result and panic on failure.
        .expect("Unable to generate bindings");

    // Write the bindings to the $OUT_DIR/bindings.rs file.
    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    bindings
        //.write_to_file(out_path)
        .write_to_file(out_path.join("bindings.rs"))
        .expect("Couldn't write bindings!");
}

Bindgen会先带入allowlist的所有依赖,如果部分依赖包含*hola*则不会生成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 2020-05-12
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多