创建RUST中的C函数指针的接口[英] Create interface to C function pointers in Rust

本文是小编为大家收集整理的关于创建RUST中的C函数指针的接口的处理方法,想解了创建RUST中的C函数指针的接口的问题怎么解决?创建RUST中的C函数指针的接口问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我可能没有正确描述我的问题标题,请在需要时进行编辑.

我正在试图将锈接口板填充到 lxc库,用c.

编写

我已经成功地称为lxc_get_version或lxc_container_new的简单函数,但我无法访问struct lxc_container block中描述的功能.

这是我代码的一部分:

#[link(name = "lxc")]
extern {
    // LXC part
    fn lxc_get_version() -> *const c_char;
    fn lxc_container_new(name: *const c_char, configpath: *const c_char) -> LxcContainer;

    // LXC container parts
    fn is_defined(container: &LxcContainer) -> bool; 
}

这是一个错误:

note: test.o: In function `LxcContainer::is_defined::heb2f16a250ac7940Vba':
test.0.rs:(.text._ZN12LxcContainer10is_defined20heb2f16a250ac7940VbaE+0x3e): undefined reference to `is_defined'

编辑:我已经管理了C结构中的函数称为函数指针.我尝试使用Google搜索" Rust C功能指针"之类的东西,但是没有运气.

推荐答案

当您看到这样的东西(在C中)时:

struct S {
    void (*f)(int, long)
}

这意味着struct S包含一个称为f的字段,该字段是函数的指针.这并不意味着库本身公开了称为f的函数.例如,这是有效的:

void some_function_1(int x, long y) { ... }

void some_function_2(int a, long b) { ... }

int main() {
    struct S s1; s1.f = some_function_1;
    struct S s2; s2.f = some_function_2;
}

在此处结构实例s1包含一个指向some_function_1的指针,s2包含一个指向some_function_2的指针.

当您为某些C库的Rust编写FFI绑定时,通常为C结构定义Rust对应物.一些工具,例如rust-bindgen,甚至可以自动执行此操作.在您的情况下,您必须写这样的东西:

#[repr(C)]
struct LxcContainer {
    name: *mut c_char,
    configfile: *mut c_char,
    // ...
    numthreads: c_int,
    // ...
    is_defined_f: extern fn(c: *mut LxcContainer) -> bool,
    state_f: extern fn(c: *mut LxcContainer) -> *const c_char,
    // ...
}

也就是说,看起来很奇怪的C函数指针类型对应于Rust中的extern fn功能指针类型.您也可以编写extern "C" fn(...) -> ...,但是"C"限定符默认情况下,因此不需要.

您将不得不写下这样的东西才能调用以下功能:

impl LxcContainer {
    fn is_defined_f(&mut self) -> bool {
        unsafe {
            (self.is_defined_f)(self as *mut LxcContainer)
        }
    }
}

您需要对原始指针进行引用,并且还需要在括号中包装self.is_defined_f才能在方法呼叫和字段访问之间解散.

您可以在rust 此处找到有关FFI的更多信息.功能指针在那里非常简短.

本文地址:https://www.itbaoku.cn/post/359065.html