Rust可以通过FFI(外部函数接口)与C语言进行交互。这允许Rust代码调用C库中的函数,反之亦然。以下是在Linux上使用Rust与C语言交互的基本步骤:
首先,你需要创建一个C库,以便Rust代码可以调用它。以下是一个简单的C库示例:
// my_c_library.h
#ifndef MY_C_LIBRARY_H
#define MY_C_LIBRARY_H
#ifdef __cplusplus
extern "C" {
#endif
void c_function();
#ifdef __cplusplus
}
#endif
#endif // MY_C_LIBRARY_H
// my_c_library.c
#include <stdio.h>
#include "my_c_library.h"
void c_function() {
printf("Hello from C!\n");
}
编译C库为静态库或动态库:
gcc -c my_c_library.c -o my_c_library.o
ar rcs libmy_c_library.a my_c_library.o # 静态库
# 或者
gcc -fPIC -c my_c_library.c -o my_c_library.o
gcc -shared -o libmy_c_library.so my_c_library.o # 动态库
在Rust代码中,你需要使用extern关键字声明要调用的C函数,并使用unsafe块来调用它们。首先,在Cargo.toml文件中添加build.rs脚本以链接C库:
[dependencies]
libc = "0.2"
[build-dependencies]
cc = "1.0"
然后,创建一个build.rs文件,用于编译C库:
fn main() {
cc::Build::new()
.file("my_c_library.c")
.compile("my_c_library");
}
接下来,在Rust代码中声明C函数并调用它:
// main.rs
extern crate libc;
use std::os::raw::{c_void};
#[link(name = "my_c_library", kind = "static")] // 或者 "dylib",如果你使用的是动态库
extern "C" {
fn c_function();
}
fn main() {
unsafe {
c_function();
}
}
现在,你可以运行cargo run来编译并运行Rust程序,它将调用C库中的函数。
注意:在与C语言交互时,需要确保内存安全。在Rust中使用unsafe块时要格外小心,确保遵循Rust的内存安全规则。