在上一篇里我们已经讲了怎么在Rust项目里加入到C code的编译支持
而且 我们也看到 c code的so lib已经 形成
这一篇我们就来展示怎么在RUST里去调用 C code 的function
在rust里用来支持,其它语言调用的技术 叫做FFI。
这里不去详细介绍FFI的全部分内容。有兴趣可以参考FFI spec
- 新增一个文件ffi.rs.用来实现对c func的调用。
use libc::c_int;
#[link(name="mylib")]
extern{
pub fn my_lib_func(arg1:c_int);
}
这里用到了rust提供的libc. 需要在cargo.toml里添加对他的依赖
[dependencies]
libc = "*"
link tag 用来告诉rust他要link到mylib.
extern block里声明对c function的引用
- 调用c function
mod ffi;
fn ffi_test(){
unsafe{ffi::my_lib_func(1 as c_int)};
}
这里直接调用前面在ffi.rs里声明 的c function.
需要 注意的是因为调用 别的语言,需要 用unsafe 把他包起来
后面就可以直接在main里调用 ffi_test就可以了
- 修改build.rs.
最后我们需要 修改build.rs。让rust可以link到 c lib就可以了
use std::process::Command;
use std::env;
//use std::path::Path;
fn main() {
let out_dir = env::var("OUT_DIR").unwrap();
Command::new("gcc").args(&["src/c_lib/mylib.c","--shared", "-fPIC", "-o"])
.arg(&format!("{}/libmylib.so", out_dir))
.status().unwrap();
println!("cargo:rustc-link-lib=dylib=mylib");
println!("cargo:rustc-link-search=native={}", out_dir);
println!("cargo:rerun-if-changed=src/c_lib/mylib.c");
}
- 最后运行cargo run
运行cargo run后。 我们就可以看到 c lib function 被调用了。
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Runningtarget/debug/hello_rust_2
this is my c lib(4.0) func:1