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

相关推荐
ElfBoard2 小时前
ElfBoard技术贴|如何在ELF-RK3506开发板上构建AI编程环境
c语言·开发语言·单片机·嵌入式硬件·智能路由器·ai编程·嵌入式开发
洲星河ZXH2 小时前
Java,泛型
java·开发语言·windows
木木木一2 小时前
Rust学习记录--C13 Part1 闭包和迭代器
开发语言·学习·rust
木木木一2 小时前
Rust学习记录--C13 Part2 闭包和迭代器
开发语言·学习·rust
Wcy30765190662 小时前
文件包含漏洞及PHP伪协议
开发语言·php
CopyProfessor2 小时前
Java Agent 入门项目模板(含代码 + 配置 + 说明)
java·开发语言
枫叶丹42 小时前
【Qt开发】Qt系统(八)-> Qt UDP Socket
c语言·开发语言·c++·qt·udp
一晌小贪欢2 小时前
用 PyQt5 做一个「批量目录重命名」工具,并打包成带图标的 EXE
开发语言·驱动开发·python·python基础·python小白
阿蒙Amon2 小时前
C#每日面试题-简述类成员
开发语言·c#