如何用 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
.
为它们生成测试
我有现有的 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
.