c - 如何用 Rust 包装现有的 C 函数或如何从 Rust 调用 C 函数?
问题描述
我有现有的 C 代码及其标头,我需要从 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
.
推荐阅读
- node.js - Node.js 在用户定义的函数终止时回调函数
- redis - Redis geo有存储多边形的能力吗?
- reactjs - ReactJS(引导数据表):添加带有 ID 的编辑按钮
- c - fread(): 无法读取 /proc/$pid/status 的文件
- php - 网站分析中来自 Instagram 的 Facebook 广告。UTM_source 显示 facebook 但 uc_referrer 和 uc_last_referrer 显示 Instagram
- pandas - pandas groupby 应用优化循环
- message-queue - 什么术语用于描述在接收到多个相同事件后对一个事件起作用的排队/消息传递系统?
- r - 改变前 n 行而不丢弃其他行
- beautifulsoup -
使用 bs4 用换行符替换标签的问题 - c++ - cpp 使用带有 size_t 的 abs() 函数