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

相关推荐
人间凡尔赛10 小时前
Next.js 16 生产级实战:Cache Components + View Transitions 完整指南
开发语言·javascript·ecmascript
稚南城才子,乌衣巷风流14 小时前
函数:编程中的核心概念
开发语言·前端·javascript
阿米亚波14 小时前
【C++】流式数据输入处理(不完全整理)
开发语言·c++·笔记
大模型码小白15 小时前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
皓月斯语15 小时前
【C++基础】三目运算符
开发语言·数据结构·c++
初願致夕霞16 小时前
C++懒汉单例设计详解
服务器·开发语言·c++
脱胎换骨-军哥16 小时前
C++分布式系统设计:从通信引擎到分布式共识
开发语言·c++·分布式
脱胎换骨-军哥17 小时前
C++零成本抽象理论深度拆解:现代C++如何在不牺牲性能的前提下提供高级语法封装
java·开发语言·c++
lbb 小魔仙17 小时前
VS Code Python 高级调试技巧:从入门到精通
开发语言·python
方便面不加香菜17 小时前
C++ 模板进阶
开发语言·c++