c - 如何用 Rust 包装现有的 C 函数或如何从 Rust 调用 C 函数?

标签 c rust ffi

我有现有的 C 代码及其 header ,我需要从 Rust 调用 C 代码。我尝试了很多方法并引用了文档,但我不明白如何将其应用到我的代码中。我在将 C 函数转换为 Rust 时遇到困难。请帮我举一些例子,以便我更容易理解。

我尝试使用 Rust 书中给出的示例和其他网站示例,但没有资源对此有更多详细信息。

C_code.h

void ifx_vec_init_r(ifx_Vector_R_t* vector,
                    ifx_Float_t* d,
                    uint32_t length);

void ifx_vec_init_c(ifx_Vector_C_t* vector,
                    ifx_Complex_t* d,
                    uint32_t length);

void ifx_vec_rawview_r(ifx_Vector_R_t* vector,
                       ifx_Float_t* d,
                       uint32_t length,
                       uint32_t stride);

void ifx_vec_sub_r(const ifx_Vector_R_t* v1,
                   const ifx_Vector_R_t* v2,
                   ifx_Vector_R_t* result);

我想在 Rust 中调用上述所有函数,但我无法理解如何开始或如何更改。我们需要注意什么来包装这个 C 代码?有哪些途径?

最佳答案

如果您尝试从 Rust 调用 C 代码,您需要创建 FFI 绑定(bind),正如某些人在评论中提到的那样。

但是,通常最好通过 rust-bindgen 执行此操作,它会自动生成绑定(bind)并包括测试以确保结果的大小、对齐等正确。创建大小不正确的类型非常容易,这不会在编译时给您警告,并可能导致未定义除非您使用 bindgen 为它们生成测试。

关于c - 如何用 Rust 包装现有的 C 函数或如何从 Rust 调用 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58708760/

相关文章:

c - 分析字符串中字符的频率

c - 释放 String 对象

python - python 有 EXIT_SUCCESS 常量吗?

rust - 我应该在 FFI 上下文中传递可变引用还是转移变量的所有权?

javascript - node.js ffi 导入常量

c - sem_wait() 上的总线错误

rust - 闭合体的生命周期与传递给它的值之间不匹配

rust - 为什么结构中的 Box<T> 为 "explicit lifetime bound required"?

asynchronous - 将数据从流转发到 Tokio mpsc channel

java - 如何在java中获取解决方案X prolog