FFI 与 C 互操作
学习目标
- 掌握
extern "C" 声明
- 调用 C 函数
- 暴露 Rust 函数给 C
核心概念
调用 C 函数
extern "C" {
fn abs(input: i32) -> i32;
fn sqrt(input: f64) -> f64;
}
fn main() {
unsafe {
println!("abs(-5) = {}", abs(-5));
println!("sqrt(16) = {}", sqrt(16.0));
}
}
暴露给 C
#[no_mangle]
pub extern "C" fn rust_add(a: i32, b: i32) -> i32 {
a + b
}
CString 和 CStr
use std::ffi::{CString, CStr};
use std::os::raw::c_char;
extern "C" {
fn strlen(s: *const c_char) -> usize;
}
fn main() {
let c_str = CString::new("Hello, C!").unwrap();
unsafe {
let len = strlen(c_str.as_ptr());
println!("长度: {}", len);
}
}
链接 C 库
fn main() {
println!("cargo:rustc-link-lib=m");
}
extern "C" {
fn pow(base: f64, exp: f64) -> f64;
}
fn main() {
unsafe {
println!("2^10 = {}", pow(2.0, 10.0));
}
}
小结
| 语法 | 用途 |
|---|
extern "C" | 声明外部 C 函数 |
#[no_mangle] | 保持函数名不改编 |
CString | Rust → C 字符串 |
CStr | C → Rust 字符串 |