生成Rust ffi绑定到C ++库

问题描述

我正在尝试使用cxx cratehelios_dac生成防锈绑定。 DAC代码几乎只是一个文件(HeliosDAC.h)和一个实现(HeliosDAC.cpp)。它也取决于libusb.h,但是到达它时我们会烧掉它。

这是我的建筑物脚本:

//build.h

fn main() {
    cxx_build::bridge("src/lib.rs")
        .cpp(true)
        .file("src/HeliosDac.cpp")
        .flag_if_supported("-std=c++14")
        .flag_if_supported("-fPIC")
        .compile("helios-bridge");

    println!("cargo:rerun-if-changed=src/lib.rs");
    println!("cargo:rerun-if-changed=src/HeliosDac.cpp");
    println!("cargo:rerun-if-changed=src/HeliosDac.h");
}

这是我的桥接代码

//lib.rs

#[cxx::bridge]
mod ffi {
    extern "C" {
        include!("helios/src/HeliosDac.h");

        type HeliosDac;
        // Functions implemented in C++.
        fn HeliosDac() -> UniquePtr<HeliosDac>;
        fn OpenDevices() -> i32;
        fn CloseDevices() -> i32;
        //fn WriteFrame(devNum: u32,pps: u32,flags: u8)
    }

    extern "Rust" {
    }
}


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        assert_eq!(2 + 2,4);
        let ndevs = ffi::OpenDevices();
        println!("{}",ndevs);
    }
}

代码的组织方式如下。

helios/
    build.rs
    src/
        HeliosDac.cpp
        HeliosDAC.h
        libusb.h
        lib.rs

当我运行cargo build时,编译器会尽力帮助我,但我听不懂。对于我实现的每个“ C”函数,它都会发出有关该函数名称不在范围内的警告:

cargo:warning=   int32_t (*CloseDevices$)() = CloseDevices;
cargo:warning=                                ^~~~~~~~~~~~

它甚至给了我一个建议:

note: suggested alternative: ‘CloseDevices$’

因此它可以看到一个函数名,但是最后还有一个&号? 有人可以向新手解释这里发生了什么吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)