在系统编程和高性能应用开发中,Rust调用C函数是一个非常实用且常见的需求。无论是为了复用现有的C库,还是为了与底层操作系统交互,掌握Rust外部函数接口(Foreign Function Interface, FFI)都是 Rust 开发者的重要技能。
本教程将从零开始,带你一步步学习如何在 Rust 中安全、高效地调用 C 函数。即使你是编程新手,也能轻松上手!
Rust FFI 是 Rust 提供的一套机制,允许 Rust 代码调用其他语言(尤其是 C 语言)编写的函数,也支持被其他语言调用。由于 C 语言具有稳定的 ABI(应用程序二进制接口),Rust 选择以 C 为桥梁与其他语言交互。

我们先创建一个名为 math.c 的 C 文件,其中包含一个加法函数:
// math.c#include <stdio.h>// 声明一个简单的加法函数int add(int a, int b) { return a + b;}然后,我们需要将这个 C 文件编译成静态库(.a 文件)或动态库(.so / .dll)。这里我们生成一个静态库:
# Linux/macOS$ gcc -c -o math.o math.c$ ar rcs libmath.a math.o# Windows (使用 MinGW 或 MSVC)# 示例略,通常生成 .lib 文件接下来,我们在 Rust 项目中通过 extern "C" 块来声明 C 函数的签名。创建一个新的 Rust 项目:
$ cargo new rust_call_c$ cd rust_call_c编辑 src/main.rs 文件:
// src/main.rs// 声明外部 C 函数extern "C" { fn add(a: i32, b: i32) -> i32;}fn main() { // 调用 C 函数必须在 unsafe 块中 let result = unsafe { add(3, 5) }; println!("3 + 5 = {}", result);}注意:所有通过 FFI 调用的外部函数都必须包裹在 unsafe 块中,因为 Rust 无法验证这些函数是否符合内存安全规则。
为了让 Rust 找到我们的 C 函数,需要告诉链接器去哪里找 libmath.a。我们可以在 build.rs 构建脚本中完成这一操作。
首先,在项目根目录创建 build.rs:
// build.rsfn main() { // 将 C 源文件编译并链接 cc::Build::new() .file("math.c") .compile("math");}然后,在 Cargo.toml 中添加对 cc crate 的构建依赖:
[package]name = "rust_call_c"version = "0.1.0"edition = "2021"[build-dependencies]cc = "1.0"现在,运行 cargo run,你应该会看到输出:
3 + 5 = 8使用 Rust与C互操作时,务必注意以下几点:
unsafe 块中进行;#[repr(C)] 注解 Rust 结构体,以保证其内存布局与 C 兼容。通过本教程,你已经学会了如何使用 Rust FFI教程中的核心方法来调用 C 函数。这不仅让你能够复用庞大的 C 生态系统,还能在需要极致性能的场景下发挥 Rust 的优势。
记住:虽然 FFI 强大,但也要谨慎使用。保持接口简单、明确,并始终在 unsafe 块中做最小化的操作,是写出安全混合代码的关键。
现在,你可以尝试封装更复杂的 C 库(如 OpenSSL、SQLite 等),开启你的 Rust调用C函数实战之旅!
本文由主机测评网于2025-12-06发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123761.html