返回總篇 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