浅谈 Rust bindgen 工具

rust bindgen 工具用于帮助 rust 开发者调用现成的 C 代码。如果不使用 rust bindgen 工具,rust 开发者为调用现成的 C 代码需要做以下工作:

  1. 看准要使用的那些 C 函数,观察其参数和返回值的数据类型
  2. 在 Rust 代码中定义相应的 Rust 类型,使其符合对应 C 类型的内存布局,可能需要使用 #repr(C) 这样的属性。
  3. 在 Rust 代码中定义相应的 Rust 函数声明(在 extern "C" 块中完成),这告诉编译器:这个函数是一个外部实现的函数,而且对他的调用要符合 C ABI
  4. 编译器会为这种只有声明的函数生成重定位条目,等待链接器为相应的 call 指令填入正确的地址。

其中前三条是需要 Rust 开发者手工完成的。如果只针对一两个特定的 C 函数进行上述工作,工作量是可以接受的。如果引入一个完整的 C 库,那么对 C 库中每一个数据结构和函数声明都进行上述工作,工作量就很大了。这时就需要 bindgen 工具帮忙。

bindgen 会解析 C 库中的头文件(利用 LLVM 项目的 clang 前端),认识其中的数据类型和函数定义,并自动生成 Rust 绑定------即带 #repr(C) 属性的 rust 结构体和 extern "C" 块中的 rust 函数声明。之后 rust 编译器就能根据这些 rust 绑定生成正确的对 C 库的调用代码

相关推荐
doiito1 小时前
【Agent Harness】Gliding Horse 核心设计理念,不跟风开发自己的AI Agent
ai·rust·架构设计·系统设计·ai agent
花褪残红青杏小11 小时前
Rust图像处理第6节- 均值模糊 & 中值模糊:3×3 邻域的两种经典玩法
rust·webassembly·图形学
子兮曰15 小时前
前端工具链的「Rust 化」:一场没有赢家的军备竞赛?
前端·后端·rust
星栈17 小时前
写 Dioxus Demo 不难,难的是把它写成项目
前端·rust·前端框架
mCell18 小时前
【锐评】桌面端技术营销:别拿跑分当工程判断
前端·rust·electron
武子康1 天前
调查研究-201 Rust 里的 dev build 和 release build:为什么同一份代码性能差这么多?
后端·架构·rust
doiito1 天前
【Agent Harness】Gliding Horse 的 L2 作战地图:让多 Agent 协作从“摸黑”变成“透明”
ai·rust·架构设计·系统设计·ai agent
星栈2 天前
我用 Rust + Dioxus 做了个全栈跨平台笔记应用:再把新建、编辑和交付补上
前端·rust·前端框架
独孤留白2 天前
从C到Rust:基本类型 C 的隐式不确定 vs Rust 的显式确定
rust
清晨很温柔啊2 天前
# 用 Rust 手搓 AI 自演化主板:当 18 个异构器官长出 C++ 骨骼
rust