第 23 章 外部函数
吉姆•布兰迪
赛博空间。难以想象的复杂性。光线交织在思维的非空间、数据的集群和星座中。就像城市的灯光,渐行渐远……
——《神经漫游者》,William Gibson
很遗憾,世界上并不是每个程序都是用 Rust 编写的。我们希望能够在 Rust 程序中使用以其他语言实现的关键库和接口。Rust 的外部函数接口(foreign function interface,FFI)允许 Rust 代码调用以 C 语言编写的(在某些情况下是用 C++ 编写的)函数。由于大多数操作系统提供了 C 接口,因此 Rust 的外部函数接口能帮你立即访问各种底层设施。
在本章中,我们将编写一个与 libgit2 链接的程序,libgit2 是用于 Git 版本控制系统的 C 库。我们将先展示如何借助第 22 章演示的不安全特性在 Rust 中直接使用 C 函数,然后再展示如何构建 libgit2 的安全接口,这些灵感都来自开源的 git2-rs crate。
假设你已经熟悉 C 以及编译和链接 C 程序的机制。如果你擅长使用 C++,那么情况也一样。假设你对 Git 版本控制系统也比较熟悉。
确实存在用于和许多其他语言(包括 Python、JavaScript、Lua 和 Java)通信的 Rust crate。由于篇幅所限,本书就不详细介绍了,但归根结底,所有这些接口都是用 C 的外部函数接口构建的,因此无论要使用哪种语言,本章都会为你提供一个良好的开端。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
![](https://static001.geekbang.org/resource/image/d0/e4/d0880927e2a522a038be2d04bf19dfe4.png)
本文深入介绍了Rust FFI(Foreign Function Interface)与C语言进行交互的基础知识。首先探讨了Rust和C之间数据表示的共同点,包括原始类型和结构体类型的对应关系。通过示例演示了如何使用#[repr(C)]属性定义与C结构体兼容的Rust结构体类型,以及如何控制C风格枚举的表示法。此外,还介绍了在Rust和C之间传递字符串的困难以及如何声明外部函数与变量,以及使用库中的函数。文章还提供了在Rust中使用外部函数接口的基础知识,以及与C代码进行交互的方法。通过示例和技术细节,为读者提供了Rust FFI的基本概念和实际应用。文章还介绍了构建脚本的编写,以告知Rust在何处搜索库,以及如何处理共享库的路径问题。最后,文章提到了构建安全的Rust接口的关键策略,展示了如何在Rust中使用libgit2函数和类型。同时,还介绍了libgit2的安全接口设计规则和如何通过Rust的类型系统构建强制执行这些规则的libgit2 Rust接口。文章深入浅出地介绍了Rust FFI与C语言交互的技术细节,为读者提供了全面的了解和实际应用指导。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论