Rust FFI 编程 - Bindgen 工具介绍
前面我们经历了《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 实战的讲解。
本篇内容就介绍到这里。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [- Flutter 数据&状态篇 -] setState
- flutter 自定义websocket路由的实现
- Flutter开发之路由与导航的实现
- Android BSearchEdit 搜索结果选择框的实例代码
- 使用AccessibilityService实现微信自动切换账号功能
- Android评分RationBar控件使用详解
- Flutter里面错误捕获的正确方法
- django3 websockets
- 使用AccessibilityService实现自动遍历点赞功能
- Android自定义字母导航栏
- [-Flutter 自组篇-] 圆形进度条
- Flutter 滚动监听及实战appBar滚动渐变的实现
- Android 开机充电图标和充电动画效果
- 使用tea算法对数据进行加密
- Android实现页面翻转和自动翻转功能