返回总篇 Rust调用C lib
本篇是rust调用C code的一部分
主要讲我们要怎么让rust帮我们把C的部分调用gcc编译出来
这里我们展示如何编出一个so
- 我们先要写一 .c档,把他放在src/c_lib下面
├── build.rs
├── Cargo.lock
├── Cargo.toml
├── src
│ ├── c_lib
│ │ └── mylib.c
│ ├── ffi.rs
│ └── main.rs
看到我们在 c_lib下面放了mylib.c
#include <stdio.h>
void my_lib_func(int a)
{
printf("this is my c lib(3.0) func:%d\n", a);
}
- 修改Cargo.toml, 添加 build
[package]
name = "hello_rust_2"
version = "0.1.0"
authors = ["jason_wang jason_wang@realsil.com.cn"]
edition = "2018"
build = "build.rs"
这里增加一个build定义,为他指定一个.rs档(build.rs)。后面我们会在里面添加针对c code的编译指令。
用来告诉cargo 怎么去编译
- 在build.rs里添加编译指令
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();
}
- 运行 cargo build
这时候再运行cargo build, cargo就会帮我们编出我们lib
$ find -iname libmylib.so
./target/debug/build/hello_rust_2-db874a0553dac78f/out/libmylib.so
关于详细的 build script写法。可以去参考cargo book
https://doc.rust-lang.org/cargo/reference/manifest.html#the-build-field
https://doc.rust-lang.org/cargo/reference/build-scripts.html