[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