基本
这里假设您熟悉 Rust 的基础知识 ,以及 您将要调用的语言。 你应该阅读下官方 FFI 文件,但这里会概括一些基础知识.
Rust
所有 Rust 示例,都将使用 cargo 和libc 箱子。 每个示例的Cargo.toml
,都包含以下样板:
[dependencies]
libc = "*"
[lib]
crate-type = ["cdylib"]
crate-type = ["cdylib"]
会创建一个动态链接的库。 可查看 Cargo 文档的动态或静态库,了解更多信息.
cdylib
是在 RFC 1510 中引入,并改善了现有的dylib
文件,减小其大小,和导出更少符号。 它是在 Rust 1.10 中实现的; 如果您使用的是早期版本,那鼓励您升级,但也可以继续使用dylib
,带点小的不良影响而已。
一些示例非常小,且不会使用 Rust 标准库中的任何功能。 这有个已知问题和链接的失败问题。 唯一的解决方法是包含一个导出,但未使用的函数,该函数使用了标准库中的某些内容。这些函数被叫做fix_linking_when_not_using_stdlib
,并在任何大型项目中,都可以安全地删除。
C
所有 C 示例 都将使用 C11 标准 进行编译。
Ruby
所有 Ruby 示例都将使用 Ruby 2.5 和 FFI gem。
Python
所有 Python 示例都将使用 Python 3.7 和ctypes 库。
Haskell
所有 Haskell 示例都将使用 GHC 8.4 的 ForeignFunctionInterface
语言扩展,且只有base
GHC 附带的库.
Node.js
所有 Node.js 示例 都将使用 Node.js 8.12 和ffi 包。
C\
所有 C#示例 都将使用 Mono 5.14 进行编译. 假设此代码将 与 Microsoft CLR 框架一起使用,但这是未经测试的.
Julia
所有的例子使用 Julia 1.0, 并依赖语言的内置C 函数调用功能。 也可能运行在 v0.7, 但并未测试.
运行示例
运行示例时,您需要确保系统可以找到 Rust 动态(链接)库。
对 mac OS X 和 Linux 上的大多数 shell,可以通过在命令前加上LD_LIBRARY_PATH=target/debug
来完成。例如,要运行 Python 示例,您可以使用LD_LIBRARY_PATH=target/debug python src/main.py
.
在 Windows 上,最简单的操作是在运行示例之前, 将 已编译的动态库,复制到当前工作目录中。 你只需要.dll
文件。 另请注意,在运行 Python 示例时,您可能希望使用py
代替python
,特别是如果您安装了多个版本的 Python。