You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Rust bindgen生成带hidden可见性的C函数绑定?

如何让rust-bindgen生成带有hidden可见性属性的C函数绑定?

问题背景

使用rust-bindgen为静态链接的第三方C库生成Rust绑定时,发现被__attribute__((visibility("hidden")))修饰的函数不会被默认生成绑定,但静态链接场景下这些函数实际可访问,且无法修改第三方头文件。

示例C头文件header.h:

__attribute__((visibility("hidden"))) void f_hidden();
__attribute__((visibility("default"))) void f_default();

执行bindgen header.h生成的Rust代码仅包含默认可见性的函数:

/* automatically generated by rust-bindgen 0.66.1 */

extern "C" {
    pub fn f_default();
}

解决方法

可以通过以下几种方式配置bindgen,使其生成hidden属性函数的绑定:

1. 命令行指定允许列表

直接在bindgen命令中通过--allowlist-function参数指定需要生成的hidden函数,支持精确匹配或正则通配:

# 生成单个hidden函数的绑定
bindgen header.h --allowlist-function "f_hidden"

# 生成所有函数的绑定(包含hidden属性的)
bindgen header.h --allowlist-function ".*"

2. 构建脚本(build.rs)配置

如果使用build.rs管理绑定生成,可通过bindgen::Builder的allowlist_function方法添加规则:

use bindgen::Builder;
use std::path::PathBuf;

fn main() {
    let bindings = Builder::default()
        .header("header.h")
        // 允许单个hidden函数
        .allowlist_function("f_hidden")
        // 或者允许所有函数(按需选择)
        // .allowlist_function(".*")
        .generate()
        .expect("生成绑定失败");

    let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap());
    bindings
        .write_to_file(out_dir.join("bindings.rs"))
        .expect("写入绑定文件失败");
}

3. 全局禁用符号隐藏

使用--no-hide-function-names参数强制bindgen不忽略任何函数符号(包括hidden属性的),但会生成所有函数,需谨慎使用:

bindgen header.h --no-hide-function-names

内容的提问来源于stack exchange,提问作者Gottox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:12:22