在上一篇里我們已經講了怎么在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