Rust: Bindgen绑定CTP C++原生接口尝试

删除回忆录丶 提交于 2020-10-06 11:34:44

一、 环境准备:

WSL2 +Bindgen + CTP C++ 接口 for linux
Bindgen: https://github.com/rust-lang/rust-bindgen

CTP for linux
在这里插入图片描述说明一下,我在windows环境下,同样的方法,一直报libclang没有找到,至今也没有解决,看了github bindgen issues上提的问题,类似的问题不少。试了不少方法,终于放弃,转WSL2.

二、构建wrapper.hpp 文件

wrapper.hpp是告诉bindgen,我这些都需要帮我翻译一下。东西在这呢。这个文件可以放在src目录下。

#include "../ctp_sdk/ThostFtdcMdApi.h"
#include "../ctp_sdk/ThostFtdcTraderApi.h"
#include "../ctp_sdk/ThostFtdcUserApiStruct.h"
#include "../ctp_sdk/ThostFtdcUserApiDataType.h"

三、倒腾build.rs文件
build.rs文件,放在工程目录的根目录下,我这儿的工程名是“rust_new_test”,build.rs放在和Cargo.toml同一目录级下,并列就好。

use std::env;
use std::path::PathBuf;

fn main() {
   
   
    let bindings = bindgen::Builder::default()
        // The input header we would like to generate
        // bindings for.
        .header("src/wrapper.hpp")
        /* // Tell cargo to invalidate the built crate whenever any of the
        // included header files changed.
        .parse_callbacks(Box::new(bindgen::CargoCallbacks)) */
        .ignore_methods()
        .rustified_enum(".*")
        .blacklist_item("CTP_SIDE_TYPE")
        .blacklist_item("CTP_POSITION_EFFECT_TYPE")
        .blacklist_item("TCTPTradeTypeType")
        .blacklist_item("TCTPOrderTypeType")
        .blacklist_function("TraderSpiStub_Rust.*")
        .blacklist_function("QuoteSpiStub_Rust.*")
        /* .default_enum_style(bindgen::EnumVariation::Rust {
            non_exhaustive: true,
        }) */
        // Finish the builder and generate the bindings.
        .generate()
        // Unwrap the Result and panic on failure.
        .expect("Unable to generate bindings");

    // Write the bindings to the $OUT_DIR/bindings.rs file.
    //let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    let out_path = PathBuf::from("/home/sg/rust_new_test");
    println!("out_path: {:?}",out_path);
    bindings
        .write_to_file(out_path.join("bindings.rs"))
        .expect("Couldn't write bindings!");
}

blacklist_item、blacklist_function是指哪些不需要进行翻译的项。

四、Cargo.toml

[package]
name = "rust_new_test"
version = "0.1.0"
authors = ["sg"]
edition = "2018"

[dependencies]

lazy_static ="1.4"
libc = "0.2"

[build-dependencies]
bindgen = "0.55.1"
cc = "1.0"

五、lib.rs :视情况

如果Cargo.toml文件中没有lib设置(如下,类似),则lib.rs可以忽略。

[lib]
name ="ctp"
path ="src\lib.rs"

如果有lib设置,lib.rs路径可以设“src\lib.rs”,即放在src目录下,设一个空文件即可。

六、cargo build
输入:

cargo build

这样,binding.rs就自动生成了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!