[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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM