`RUST` 调用 `C` 代码

`RUST` 调用 `C` 代码

  • `RUST` 调用 `C` 代码
    • 库源代码
    • 使用 `C` 源码
    • 使用第三方 `C` 库

RUST 调用 C 代码

最近要做一些 Linux 底层的设计,发现使用纯 rust 会比较困难,于是想到了使用 rust 来作上层的应用,使用 C 代码来进行底层跟设备的数据交互。

库源代码

pr.c

#include 

void pr(char* string)
{
	printf("anlj: %s", string);
}

使用 C 源码

  • 需要在 build.rs 中对源码进行编译;
  • main.rs 中对使用到的 C 代码进行声明;

目录树

rust-c/
├── build.rs
├── Cargo.toml
├── pr.c
└── src
    └── main.rs

main.rs

use std::ffi::CString;
use std::os::raw::c_char;

extern "C" {
    fn pr(string:*const c_char);
}

fn main() {
    // 将 Rust 字符串转换为 C 字符串
    let c_string = CString::new("Hello from Rust!").expect("CString::new failed");
    // 调用 C 函数
    unsafe {
        pr(c_string.as_ptr());
    }
}

build.rs

extern crate cc;

fn main(){
    cc::Build::new().file("pr.c").compile("libpr.a");
}

Cargo.toml

[package]
name = "rust-c"
version = "0.1.0"
edition = "2021"

[dependencies]
libc = "0.2"

[build-dependencies]
cc = "1.0"

使用第三方 C

1. 将库放到系统位置

将编译好的库放到 /lib/ 文件夹下。

然后运行

cargo run

就可以看到运行结果。

放到项目的根目录下或者项目的 src 目录下,编译时都会提示找不到库文件。

2. 指定库的位置

需要在 build.rs 中通过 println! 宏将库和库的位置输出到环境变量中。

  • 目录结构
rust-c/
├── build.rs
├── Cargo.lock
├── Cargo.toml
├── libpr.a
└── src
    └── main.rs
  • build.rs
fn main(){
    println!("cargo:rustc-link-lib=pr");
    println!(r"cargo:rustc-link-search=native=/home/alj/work/cortex-a7/rust-c");
}

3. 使用 rustc 直接指定库位置

rustc 可以附带参数;将库相关的信息作为参数添加到编译命令中,就可以得到可执行文件。

rustc -l static=pr -L. src/main.rs

你可能感兴趣的:(rust,rust,c语言,开发语言)