实现一个简单的 ffi 绑定, 分为C函数调用和lib函数调用。
C 函数调用
函数是 C 内置的,无需任何额外处理。
1
2
3
4
5
6
7
8
9
10
11
12
| use std::ffi::{c_char, CString};
extern {
// 计算字符串长度
fn strlen(ptr: *const c_char) -> usize;
}
fn main() {
let s = CString::new("123").unwrap();
let len = unsafe { strlen(s.as_ptr()) };
println!("len: {}", len);
}
|
lib 函数调用
外部函数绑定, 主要分为这几步,详情见 README.md)
- 声明 link name
- 编译处理
- 环境变量配置
1
2
3
4
5
6
| #[link(name = "git2")]
extern {
// const git_error * giterr_last();
pub fn giterr_last() -> *const git_error;
...
}
|
1
2
3
4
| // build.rs
fn main() {
println!("cargo:rustc-link-search=native={}", "./libgit2/build");
}
|
1
2
3
4
5
6
7
| # 配置环境变量
# macos
export DYLD_LIBRARY_PATH=./libgit2/build/:$DYLD_LIBRARY_PATH
# linux
export LD_LIBRARY_PATH=./libgit2/build/:$LD_LIBRARY_PATH
|
代码示例
github