如何在 C 中调用 Rust 函数?
How to call a Rust function in C?
发帖时向我展示的第一个“类似问题”称为“如何在 Rust 中调用 C 函数”。这与我需要的相反。我能找到的每个教程在技术上确实回答了我的问题,只是通过在 DLL 中导出 Rust 函数,以便 C 可执行文件可以调用它,使用 extern "C"
.
但是我有一个 Rust 可执行文件,它正在调用一个 C DLL 函数,该函数将 Rust 函数指针作为参数(我还没有真正编写这个 C 函数)。任何基本示例演示如何执行此操作?我已经让 Rust 调用一些 C DLL 函数,但我需要为 Rust 和 C 编写代码,以便 C 可以执行 Rust 回调。
如果您将此 C 代码编译为名为 lib.dll
的库,则导出一个函数,该函数接受一个指向不带参数且 returns 没有任何参数的函数的指针:
__declspec(dllexport) void foo(void (*callback)()) {
callback();
}
然后这个 Rust 代码将函数 callback
发送到那个 C 函数。执行后,它会打印行 "callback()"
:
extern "C" fn callback() -> () {
println!("callback()");
}
fn main() {
println!("main()");
call_dynamic();
}
fn call_dynamic() -> Result<u32, Box<dyn std::error::Error>> {
unsafe {
let lib = libloading::Library::new("lib.dll")?;
let foo: libloading::Symbol<extern "C" fn(extern "C" fn()) -> u32> = lib.get(b"foo")?;
Ok(foo(callback))
}
}
您应该会在您的控制台中看到:
main()
callback()
我在 Windows 并使用此命令编译了 C 代码:
gcc --shared lib.c -o lib.dll
Rust 代码 运行 是这样的:
cargo run
发帖时向我展示的第一个“类似问题”称为“如何在 Rust 中调用 C 函数”。这与我需要的相反。我能找到的每个教程在技术上确实回答了我的问题,只是通过在 DLL 中导出 Rust 函数,以便 C 可执行文件可以调用它,使用 extern "C"
.
但是我有一个 Rust 可执行文件,它正在调用一个 C DLL 函数,该函数将 Rust 函数指针作为参数(我还没有真正编写这个 C 函数)。任何基本示例演示如何执行此操作?我已经让 Rust 调用一些 C DLL 函数,但我需要为 Rust 和 C 编写代码,以便 C 可以执行 Rust 回调。
如果您将此 C 代码编译为名为 lib.dll
的库,则导出一个函数,该函数接受一个指向不带参数且 returns 没有任何参数的函数的指针:
__declspec(dllexport) void foo(void (*callback)()) {
callback();
}
然后这个 Rust 代码将函数 callback
发送到那个 C 函数。执行后,它会打印行 "callback()"
:
extern "C" fn callback() -> () {
println!("callback()");
}
fn main() {
println!("main()");
call_dynamic();
}
fn call_dynamic() -> Result<u32, Box<dyn std::error::Error>> {
unsafe {
let lib = libloading::Library::new("lib.dll")?;
let foo: libloading::Symbol<extern "C" fn(extern "C" fn()) -> u32> = lib.get(b"foo")?;
Ok(foo(callback))
}
}
您应该会在您的控制台中看到:
main()
callback()
我在 Windows 并使用此命令编译了 C 代码:
gcc --shared lib.c -o lib.dll
Rust 代码 运行 是这样的:
cargo run