CTP:关于cc和bindgen库及rust工程组织

有三个工程目录,cpt-api, ctp-sdk,ctp-strategy

1、ctp-sdk:

主要的目的是基于bindgen库生成与cpp的.h文件相对应一个binding.rs文件,后面供策略使用。

在这个目录下,建一个build.rs,用bindgen库生成cpp.h的头文件相应的rust绑定文件,生成的文件放在ctp-api目录下

相应的buildr.s

bash 复制代码
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_function("TraderSpiStub_Rust.*")
        .blacklist_function("QuoteSpiStub_Rust.*")
        .generate_comments(false)// 不需形成doc ,默认true
        .layout_tests(false) //不需要test,默认true
        //.derive_copy(false) //实现copy的较少,去掉
        .derive_debug(true) //debug还是要的
        // .derive_hash(false) //不要实现hash
        /* .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");

    let out_path = PathBuf::from("../ctp_api/src"); //-------------------需要更新,根据具体的目录 
    //songroom/ctp/ctp_api/src
    bindings
        .write_to_file(out_path.join("ctp_type.rs"))
        .expect("Couldn't write bindings!");
    println!("bindings => path: {:?}",out_path);
}

这里去除了test,这里这样设置就可以了 .layout_tests(false),否则文件太长了,6-7万行。

这个目录下的toml文件如下

bash 复制代码
[package]
name = "ctp_api"
version = "0.1.0"
authors = ["songroom"]
edition = "2021"

[dependencies]


[build-dependencies]
bindgen = "0.55.1"

2、ctp-api(是一个lib工程)

主要是对ctp进行相关的组织。

ctp-types.rs文件:
由ctp-sdk下的build.rs生成(在ctp-sdk下运行cargo build --release).。

在这个目录下,可以组织一些ctp相应的接口相关的文件。这里不展开。

这里的toml文件并无特别。

3、ctp-strategy

在这里主要是进行策略组织,在这里build.rs中,要用到cc库。

build.rs文件

bash 复制代码
use std::env;
use std::path::PathBuf;

fn main() {
    cc::Build::new()
        .file("../ctp_sdk/src/bridge/bridge.cpp")
        .cpp(true)
        .warnings(false)
        .flag("-std=c++11")
        .compile("bridge");
    println!("cargo:rustc-link-lib=thostmduserapi_se");// "="后面不能有空格 //=后加了lib,2022/2/4
    println!("cargo:rustc-link-lib=thosttraderapi_se");// "="后面不能有空格

    println!("cargo:rustc-link-search=native=../ctp_sdk/sdk");
    // Tell cargo to invalidate the built crate whenever the wrapper changes
    println!("cargo:rerun-if-changed=../ctp_sdk/src/wrapper.hpp");
    println!("cargo:rerun-if-changed=../ctp_sdk/src/bridge/bridge.hpp");
    println!("cargo:rerun-if-changed=../ctp_sdk/src/bridge/bridge.cpp");
}

其中,build.rs中cc部分内容;println!内容不能省。

bash 复制代码
[package]
name = "ctp_strategy"
version = "0.1.0"
authors = ["songroom"]
edition = "2021"
build   = "build.rs" # 事前运行

[dependencies]
lazy_static ="1.4"
libc = "0.2"
encoding = "0.2.32"
memchr = { version = "2", default-features = false }
simple-error = "0.2.1"
time = "0.1.43"
ctp_api = {path = "../../ctp/ctp_api"}
crossbeam = "0.7.3"
crossbeam-utils="0.7.0"
log = "0.4"
chrono = "0.4.11"
failure = "0.1"
toml = "0.5"
serde = { version = "1.0", features = ["derive"] }
serde_derive ="1.0.123"


[build-dependencies]
cc = "1.0"

在ctp-strategy目录下运行:cargo build --release;结果正常:

bash 复制代码
warning: `ctp_strategy` (bin "ctp_strategy") generated 42 warnings
    Finished release [optimized] target(s) in 3.92s
dbfund@iZgw041dtbsye3lhp8lz3eZ:~/rust_ctp/ctp/ctp_strategy$ 

在运行上,先在ctp-sdk目录下,cargo build 生成后续项目依赖的类bingings.rs文件;此后在ctp-strategy上运行cargo run --release即可。

相关推荐
L.S.V.2 分钟前
Java 溯本求源之基础(三十)——封装,继承与多态
java·开发语言
游客5209 分钟前
设计模式-创建型-工厂方法模式
开发语言·python·设计模式·工厂方法模式
m0_7482349013 分钟前
Hmsc包开展群落数据联合物种分布模型分析通用流程(Pipelines)
开发语言·python
发呆的薇薇°21 分钟前
react里使用Day.js显示时间
前端·javascript·react.js
WongKyunban21 分钟前
bash shell脚本while循环
开发语言·bash
想成为高手49924 分钟前
华为仓颉编程语言的函数与结构类型分析
开发语言·华为
lly20240640 分钟前
Ruby 数据库访问 - DBI 教程
开发语言
GISer_Jing41 分钟前
前端面试题合集(一)——HTML/CSS/Javascript/ES6
前端·javascript·html
清岚_lxn43 分钟前
es6 字符串每隔几个中间插入一个逗号
前端·javascript·算法
m0_748254091 小时前
100天精通Python(爬虫篇)——第113天:爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python