在Rust中,如何从第三方库定义或导入C结构体?
发布时间:2020-12-16 06:44:41 所属栏目:百科 来源:网络整理
导读:Rust FFI指南( http://static.rust-lang.org/doc/master/guide-ffi.html)很好地演示了如何导入使用由Rust std :: lib库(例如size_t)包装的标准C类型的C函数.但是如何将第三方库中定义的C数据结构带入Rust程序? 我正在使用libmemcached,它具有以下功能: mem
Rust FFI指南(
http://static.rust-lang.org/doc/master/guide-ffi.html)很好地演示了如何导入使用由Rust std :: lib库(例如size_t)包装的标准C类型的C函数.但是如何将第三方库中定义的C数据结构带入Rust程序?
我正在使用libmemcached,它具有以下功能: memcached_st* memcached_create(memcached_st *ptr) 通常在C程序中像这样调用(踢脚): #include <libmemcached/memcached.h> // ... memcached_st *memc; memc = memcached_create(NULL); memcached_st是一个不透明的C结构 – 我如何在Rust程序中声明和使用它?这是我迄今为止失败的尝试: use std::libc::*; use ptr; #[link(name = "memcached")] extern { struct memcached_st; // error: unexpected token: `struct` memcached_st* memcached_create(memcached_st *ptr); } fn main() { unsafe { let memc = memcached_create(ptr:null()); println!("{:?}",memc); } } 和 use std::libc::*; use ptr; #[link(name = "memcached")] extern { // error: unexpected token: `memcached_st` memcached_st* memcached_create(memcached_st *ptr); } fn main() { unsafe { let memc = memcached_create(ptr:null()); println!("{:?}",memc); } } 解决方法
使用空结构是一种有效的方法.你几乎可以得到它,你不需要把结构定义放在extern块中.此外,您不能在Rust源中使用C代码 – extern定义必须遵循标准Rust语法.
use std::ptr; struct memcached_st; #[link(name = "memcached")] extern { fn memcached_create(ptr: *memcached_st) -> *memcached_st; } fn main() { unsafe { let memc = memcached_create(ptr::null()); println!("{:?}",memc); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |