[RUST]在Rust里调用 Clib里的function


在上一篇里我们已经讲了怎么在Rust项目里加入到C code的编译支持
而且 我们也看到 c code的so lib已经 形成
这一篇我们就来展示怎么在RUST里去调用 C code 的function

在rust里用来支持,其它语言调用的技术 叫做FFI。
这里不去详细介绍FFI的全部分内容。有兴趣可以参考FFI spec

  1. 新增一个文件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的引用

  1. 调用c function
mod ffi;
fn ffi_test(){
    unsafe{ffi::my_lib_func(1 as c_int)};
}

这里直接调用前面在ffi.rs里声明 的c function.
需要 注意的是因为调用 别的语言,需要 用unsafe 把他包起来
后面就可以直接在main里调用 ffi_test就可以了

  1. 修改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");
}
  1. 最后运行cargo run
    运行cargo run后。 我们就可以看到 c lib function 被调用了。

$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running target/debug/hello_rust_2
this is my c lib(4.0) func:1


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM