微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 C 中调用 Rust 函数?

如何解决如何在 C 中调用 Rust 函数?

发布时向我展示的第一个“类似问题”称为“如何在 Rust 中调用 C 函数”。这与我需要的相反。我能找到的每个教程从技术上讲都可以回答我的问题,只是通过将 Rust 函数导出到 DLL 中,以便 C 可执行文件可以使用 extern "C" 调用它。

但是我有一个 Rust 可执行文件,它正在调用一个 C DLL 函数,该函数一个 Rust 函数指针作为参数(我实际上还没有编写这个 C 函数)。任何演示如何执行此操作的基本示例?我已经让 Rust 调用了一些 C DLL 函数,但我需要为 Rust 和 C 编写代码,以便 C 可以执行 Rust 回调。

解决方法

如果您将此 C 代码编译为名为 function 的库,则导出单个函数,该函数接受指向不带参数且不返回任何内容的函数的指针:

setup();

然后这个 Rust 代码会将函数 lib.dll 发送到那个 C 函数。执行时,它打印行 __declspec(dllexport) void foo(void (*callback)()) { callback(); } :

callback

您应该在控制台中看到:

"callback()"

我在 Windows 上使用以下命令编译了 C 代码:

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))
    }
}

Rust 代码是这样运行的:

main()
callback()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。