Rust Ffi

实现一个简单的 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)

  1. 声明 link name
  2. 编译处理
  3. 环境变量配置
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

0%