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

How to wrap existing C functions with Rust or how to call C functions from Rust?

我有现有的 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 绑定,正如某些人在评论中提到的那样。

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

为它们生成测试