首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中调用Rust函数?

如何在C中调用Rust函数?
EN

Stack Overflow用户
提问于 2021-02-20 06:51:53
回答 1查看 1.6K关注 0票数 2

第一个“类似的问题”向我展示时,张贴这是称为“如何调用C函数在锈蚀”。这与我所需要的正好相反。我能找到的每个教程都能从技术上回答我的问题,只有在DLL中导出Rust函数才能这样做,这样C可执行文件就可以使用extern "C"调用它。

但是我有一个Rust可执行文件,它调用一个C DLL函数,它使用一个Rust函数指针作为参数(我还没有编写这个C函数)。有没有演示如何做到这一点的基本示例?我已经让Rust调用了一些can函数,但是我需要为Rust和C编写代码,以便C可以执行一个Rust回调。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-20 07:26:31

如果将此C代码编译到名为lib.dll的库中,则导出一个函数,该函数接受指向不带参数且不返回任何参数的函数的指针:

代码语言:javascript
复制
__declspec(dllexport) void foo(void (*callback)()) {
    callback();
}

然后,这个锈蚀代码将把函数callback发送给那个C函数。执行时,它将打印行"callback()"

代码语言:javascript
复制
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))
    }
}

您应该在控制台中看到这一点:

代码语言:javascript
复制
main()
callback()

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

代码语言:javascript
复制
gcc --shared lib.c -o lib.dll

Rust代码是这样运行的:

代码语言:javascript
复制
cargo run
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66288855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档