前面我们经历了《Rust FFI 编程 - 基础知识》、《Rust FFI 编程 - 手动绑定 C 库》和《Rust FFI 编程 - Rust 导出共享库》三个大的子系列,Rust FFI 编程的基础部分算靠以段落。可能仍然有未覆盖到的地方,可以在未来以补充文章的形式发布。

学以致用,现在我们开始进入新的阶段——应用。我们暂时规划了如下一些大的主题:

  • 自动化工具 bindgen 和 cbindgen 介绍;

  • Rust 交叉编译相关,Rust 在 Windows 平台的编译相关问题;

  • 某个 *-sys 库解析;

  • 使用 Rust 为其它动态语言写调用库:Python, Php, Nodejs, Ruby, Go, Java,Objective-C;、

  • 附录:Rust 二进制瘦身等;

另外,会单独开若干大的后续系列,不会放在本 FFI 系列中。

  • Rust 嵌入式开发系列

  • Rust 与 Wasm/WebAssembly 开发系列

  • Rust 高性能计算系列(待定)


bindgen 介绍

本篇,我们来介绍 rust-bindgen 这个项目。项目地址为:https://github.com/rust-lang/rust-bindgen。可以看到,这是一个 Rust 官方孵化的项目,目前已经比较成熟。

本篇只是一个总体的介绍,并不是对 bindgen 项目的完整讲解,也不是对 bindgen tutorial 的全面翻译。因此,真正动手操作的时候,需要仔细阅读 Tutorial 原文和查阅相关的 API。

bindgen 是一个能自动为 C(或 C++)库生成 Rust 绑定的辅助库和命令行工具。C++ (目前)的支持并不完整。

也就是说,bindgen 可以作为一个 crate,与 Cargo 的 build.rs 机制配合,根据 C/C++ 的头文件(.h, .hpp),在构建阶段,编译主体 Rust 代码之前,自动生成 Rust 绑定文件。具体,可查看示例:https://rust-lang.github.io/rust-bindgen/tutorial-0.html

bindgen 还有另一种用法,它本身也提供一个命令行工具。执行:

cargo install bindgen

便可安装。然后,在命令行下,使用

bindgen input.h -o bindings.rs

便可根据 C 头文件 input.h 动态生成 Rust 绑定文件 bindings.rs。非常简单。

但真实的场景远不如想象中这么纯洁。于是就有一堆可能的修补工作。bindgen 为我们提供了各种修补之法(这才是精华)。具体来说,有如下一些措施:

  • 白名单

  • 黑名单

  • Opaque 对象

  • 类型替换

  • 其它

这些措施有的可以用在库的模式下,命令行模式下,以及在源代码(C)的注释中添加标注的模式下。有的三种都能覆盖,有的只能覆盖其中一种或两种。具体可在 https://rust-lang.github.io/rust-bindgen/customizing-generated-bindings.html 页面找到详细解释。

同时,bindgen 对 C 的 Union 和 Bitfields 的特性,也有对应的处理策略。这些在实际封装的过程中,可能会经常碰到。

bindgen 本身知识点,并不多。重点在于实战,在实战中体会各种细节。后面我们也会拿一到两篇进行 bindgen 实战的讲解。

本篇内容就介绍到这里。

Rust FFI 编程 - Bindgen 工具介绍相关推荐

  1. Rust FFI 编程 - bindgen 使用示例

    当我们拥有一组具有良好声明的头文件时,自己定义 C 库的 Rust FFI 绑定函数是毫无意义的.我们可以使用 bindgen 这种工具从 C 库的头文件生成 Rust FFI 绑定函数.然后,我们运 ...

  2. Rust FFI 编程--理解不同语言的数据类型转换

    1. 简介 "FFI"是" Foreign Function Interface"的缩写,大意为不同编程语言所写程序间的相互调用.鉴于C语言事实上是编程语言界的 ...

  3. Rust中FFI编程知识点整理总结

    Rust语言对FFI的支持 Rust 语言主要在关键字和标准库两个方面对 FFI 提供了支持,具体如下: 关键字 extern 属性 #[no_mangle] 外部块 ExternBlock 及其属性 ...

  4. python编程工具-7款Python开发工具介绍,你最中意哪一款

    工欲善其事必先利其器,有一款好用上手的Python编辑器能够大大提高码代码的效率,而且所带来的提升不是从 1 到 1.1 倍速,是从 1 到 10 倍速.所以行哥这里来推荐几个常用的Python开发工 ...

  5. Rust嵌入式编程---动态内存分配器(Vec,String等)

    本教程不是0基础的Rust嵌入式编程,需要有一定的Rust裸机编程的基础知识. 作为一个比较接近C的例子,适合入门,代码比较容易理解.本次例子使用的是target = "thumbv8m.m ...

  6. IDEA IntelliJ 开发工具介绍

    IntelliJ IDEA 开发Java的IDE 官网:https://www.jetbrains.com/ 下面是该工具介绍,有兴趣的可以看下,基本一堆废话: 集成开发环境(IDE,Integrat ...

  7. C 语言编程 — GCC 工具链

    目录 文章目录 目录 文章目录 GCC 工具链 GCC 编译器 GCC 的常用指令选项 GCC 所遵循的部分约定规则 Binutils C 运行时库 Clang 和 LLVM 文章目录 <C 语 ...

  8. arcgis python工具-使用python制作ArcGIS插件(1)工具介绍

    使用python制作ArcGIS插件(1)工具介绍 by 李远祥 ArcGIS从10.0开始支持addin(ArcGIS软件中又叫作加载项)的方式进行插件制作.相对于以往9.x系列,addin的无论是 ...

  9. asp.net编程网页弹窗显示变量_CODESYS Engineering:面向工程应用编程的工具软件

    CODESYS集成开发环境(CODESYS IDE)是整个自动化平台开发套件CODESYS中的核心部分之一,它几乎包含了一个先进的自动化编程开发工具应具有的所有功能. 1 CODESYS Develo ...

最新文章

  1. 深度学习入门,一文讲解神经网络的构成、训练和算法
  2. SAP Distribution Model初探
  3. springboot 防重复 提交
  4. springboot中使用规则引擎Drools
  5. django models中批量导入数据
  6. Redis中的淘汰策略
  7. 2019-1-7Xiaomi Mi5 刷全球版MIUI教程
  8. 编程语言python怎么读-Python和Go都很火,我要怎么选?
  9. 深度理解__proto__ 和 prototype
  10. 详解ProToolkit注册文件
  11. C#实战010:Excel操作-查询Excel中的数据
  12. 【BZOJ4453】cys就是要拿英魂!
  13. 董宝珍:巴菲特是如何选股的?——从底层逻辑看巴菲特核心重仓股的思路、原则和条件...
  14. 张国荣5周年祭辰 张学友梁朝伟等红馆唱悼哥哥
  15. 孢子社群:今日推荐ARVR微信群:游乐VR智能
  16. css直角线_css斜切角 斜边 倒角
  17. 模拟文件目录系统-CatalogTree
  18. Hadoop的基本特点
  19. python爬取顶点小说简单版
  20. 批量删除并更改yolo格式的标签类别

热门文章

  1. 解决谷歌浏览器图片保存为JFIF格式的问题
  2. SSH使用及协议分析
  3. pom文件报错 jai_core-1.1.3.jar
  4. 【理论】SPI Flash和E2PROM区别
  5. 加密软件的问答-加密软件与密码学有什么关系?
  6. 邮储银行年薪可以达到多少,你了解吗?
  7. 无关时光无关距离无关悲欢:伤感QQ日志
  8. Android调app权限设置界面(适配各大手机厂商终极版本)
  9. H5新特性之sessionStorage
  10. Go语言获取实时网速(gopacket实践)