在现代软件开发中,Rust语言因其内存安全、零成本抽象和高性能而广受欢迎。然而,许多遗留系统或底层库仍使用C语言编写。因此,掌握C调用Rust函数的技术变得尤为重要。本文将带你从零开始,详细讲解如何通过Rust的FFI(Foreign Function Interface,外部函数接口)实现C语言对Rust函数的调用,即使你是编程小白也能轻松上手。

Rust FFI(Foreign Function Interface)是Rust提供的一种机制,允许Rust代码与其他语言(如C、C++等)进行交互。通过FFI,我们可以让C程序调用Rust编写的函数,也可以让Rust调用C函数。本文聚焦于前者:C调用Rust函数。
首先,我们需要创建一个Rust库(library),而不是可执行文件(binary)。因为C程序需要链接的是一个动态或静态库。
打开终端,运行以下命令:
cargo new --lib rust_from_c这将创建一个名为 rust_from_c 的新库项目。
进入项目目录,编辑 src/lib.rs 文件。为了让C能调用Rust函数,我们需要满足以下条件:
#[no_mangle] 属性防止函数名被Rust编译器混淆extern "C" 指定C调用约定i32, f64, *const c_char 等)下面是一个简单的加法函数示例:
use std::os::raw::c_int;#[no_mangle]pub extern "C" fn add(a: c_int, b: c_int) -> c_int { a + b}注意:c_int 是Rust中与C的 int 类型对应的类型,定义在 std::os::raw 中。
为了让C程序能链接我们的Rust代码,需要将Rust编译为动态链接库(.so / .dll / .dylib)。编辑 Cargo.toml 文件,在末尾添加:
[lib]crate-type = ["cdylib"]cdylib 表示生成一个C兼容的动态库,不包含Rust标准库的元数据,适合被其他语言调用。
在项目根目录下运行:
cargo build --release编译成功后,动态库文件将位于 target/release/ 目录下,例如:
librust_from_c.sorust_from_c.dlllibrust_from_c.dylib创建一个 main.c 文件,内容如下:
#include <stdio.h>// 声明Rust函数extern int add(int a, int b);int main() { int result = add(3, 5); printf("3 + 5 = %d\n", result); return 0;}根据你的操作系统,使用以下命令编译C程序并链接Rust动态库:
Linux/macOS:
gcc -o main main.c -L./target/release -lrust_from_cexport LD_LIBRARY_PATH=./target/release:$LD_LIBRARY_PATH # Linux# 或 export DYLD_LIBRARY_PATH=./target/release:$DYLD_LIBRARY_PATH # macOS./mainWindows (使用MinGW):
gcc -o main.exe main.c -Ltarget\release -lrust_from_ccopy target\release\rust_from_c.dll .main.exe如果一切顺利,你将看到输出:
3 + 5 = 8char*,Rust中应使用 *const c_char 接收,并用 CString/CStr 转换。Result 转换为C风格错误。通过本教程,你已经掌握了Rust语言中如何编写可被C调用的函数,并成功实现了C调用Rust函数的完整流程。这项技能在系统编程、嵌入式开发和性能关键型应用中非常实用。希望你能将所学应用到实际项目中,体验Rust FFI带来的强大能力!
如果你对跨语言编程感兴趣,不妨尝试反过来:让Rust调用C函数,或者探索更复杂的类型转换和错误处理机制。
本文由主机测评网于2025-12-16发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025128375.html