ssss 1 2 3 3 4 45

[RUST]用rust 编译C code

返回总篇 Rust调用C lib

本篇是rust调用C code的一部分
主要讲我们要怎么让rust帮我们把C的部分调用gcc编译出来
这里我们展示如何编出一个so

  1. 我们先要写一 .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);
}
  1. 修改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 怎么去编译

  1. 在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();
}
  1. 运行 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

返回 总篇 Rust调用C lib
在Rust里调用 Clib里的function

posted @ 2021-04-29 16:23  会游泳的骆驼  阅读(1345)  评论(0)    收藏  举报
百度 123

没有一个人在这个世上独活。