浅谈 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 库的调用代码

相关推荐
DongLi012 天前
rustlings 学习笔记 -- exercises/05_vecs
rust
郑州光合科技余经理2 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1232 天前
matlab画图工具
开发语言·matlab
dustcell.2 天前
haproxy七层代理
java·开发语言·前端
norlan_jame2 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone2 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054962 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月2 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
番茄灭世神2 天前
Rust学习笔记第2篇
rust·编程语言
m0_531237172 天前
C语言-数组练习进阶
c语言·开发语言·算法