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

news2024/12/25 9:11:07

有三个工程目录,cpt-api, ctp-sdk,ctp-strategy
1、ctp-sdk:
主要的目的是基于bindgen库生成与cpp的.h文件相对应一个binding.rs文件,后面供策略使用。
在这里插入图片描述

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

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文件如下

[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文件

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!内容不能省。

[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;结果正常:

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即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1051155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建个人云存储:本地电脑搭建SFTP服务器,开启公网访问,轻松共享与管理个人文件!

本地电脑搭建SFTP服务器,并实现公网访问 文章目录 本地电脑搭建SFTP服务器,并实现公网访问1. 搭建SFTP服务器1.1 下载 freesshd 服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2. 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内…

傻瓜式Java操作MySQL数据库备份

文章目录 前言存储数据库存储数据表 前言 数据库备份是开发工作中经常要做的事情,好处是mysql提供了一个非常好的命令 mysqldump,直接调用它就可以将数据以sql文件的形式备份出来。但是直接写命令非常不方便,遇到定时备份或者指定备份那么就需…

旗舰版企业CRM客户管理系统商业源码(基于Thinkphp内核开发)+无加密无域名限制+可二次开发

注:本资源提供给大家学习及参考研究借鉴美工之用,请勿用于商业和非法用途,无任何技术支持! 旗舰版企业CRM客户管理系统商业源码,它无任何加密无域名限制,并且源码可以二次开发,它是基于Thinkph…

【RabbitMQ实战】07 3分钟部署一个RabbitMQ集群

一、集群的安装部署 我们还是利用docker来安装RabbitMQ集群。3分钟安装一个集群,开始。 前提条件,docker安装了docker-compose。如果没安装的话,参考这里 docker-compose文件参考bitnami官网:https://github.com/bitnami/contai…

用Java打印长方形、平行四边形 、三角形、菱形、空心菱形

今天复习使用嵌套for来完成一些任务,于是想着打印一些图形来练习 思考感悟 长方形 行数 和 每行的星星数嵌套遍历即可 平行四边形 核心:每行空格数总行数-行数 行数空格数132231 三角形 核心:每行星星数2*当前行数-1 行数星星数1123…

【每日一题】2769. 找出最大的可达成数字

2769. 找出最大的可达成数字 - 力扣(LeetCode) 给你两个整数 num 和 t 。 如果整数 x 可以在执行下述操作不超过 t 次的情况下变为与 num 相等,则称其为 可达成数字 : 每次操作将 x 的值增加或减少 1 ,同时可以选择将 …

Elasticsearch:使用 Elasticsearch 进行语义搜索

在数字时代,搜索引擎在通过浏览互联网上的大量可用信息来检索数据方面发挥着重要作用。 此方法涉及用户在搜索栏中输入特定术语或短语,期望搜索引擎返回与这些确切关键字匹配的结果。 虽然关键字搜索对于简化信息检索非常有价值,但它也有其局…

【分布式计算】二、架构(Architectures)

1.中心化架构(Centralized Architectures) 1.1.经典C/S模型 服务器:一个或多个进程提供服务 客户端:一个或多个进程使用服务 客户端和服务器可以在不同的机器上 客户端遵循请求/回复模型 1.2.传统三层视图 用户界面层&#x…

【正点原子】开发板可以ping通电脑,电脑ping不通开发板

Uboot模式下 uboot模式下因为相关服务没有开启,只能uboot ping通电脑,电脑ping不通开发板 note: 电脑需要关闭防火墙 App模式 该模式下,如果已经打开网络还是ping不通开发板 关闭电脑wifi再重试

WebPack-打包工具

从图中我们可以看出,Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件,减少了页面的请求. 下面举个例子 : main.js 我们只命名导出一个变量 export const name"老六"index.js import { name } from "./tset/…

uboot启动流程涉及reset汇编函数

一. uboot启动流程中函数 之前了解了uboot链接脚本文件 u-boot.lds。 从 u-boot.lds 中我们已经知道了入口点是 arch/arm/lib/vectors.S 文件中的 _start。 本文了解 一下,uboot启动过程中涉及的 reset 函数。本文继上一篇文章学习,地址如下&#xff…

外包干了2个月,技术有明显退步...

先说一下自己的情况,本科生,18年通过校招进入广州某软件公司,干了接近3年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!可我已经在一个企业干了3年的功能测试&…

ELK 处理 Spring Boot 日志

ELK 处理 Spring Boot 日志,妙啊! 来源:ibm.com/developerworks/cn/java /build-elk-and-use-it-for-springboot -and-nginx/index.html ELK 简介 Logstash Elasticsearch Kibana ELK 实现方案 ELK 平台搭建 安装 Logstash 安装 Elas…

ROS系统读取USB相机图像数据

ROS系统读取USB相机图像数据 前言usb_cam 功能包下载与编译摄像头选择连接摄像头可配置参数 前言 usb_cam功能包简介 为了丰富机器人与外界的交互方式,已经增加了与机器人的语音交互方式,不仅使机器人能够说话发声,还能听懂我们说的话&#…

友思特案例|友思特 Ensenso 3D相机:汽车工业自动化的革命性力量

01 内容摘要 在竞争激烈的汽车行业,自动化生产至关重要。友思特 Ensenso 3D相机为汽车制造商提供了可靠的工具和技术支持,助力多个关键环节。它在汽车座位泡棉切割中提高精确度,降低浪费,提高生产效率;在汽车压铸零部…

第七章 查找 九、B+树

目录 一、定义 二、B树需要满足的条件 三、重要考点 一、定义 1、B树是一种常用的数据结构,用于实现关系型数据库中的索引。 2、其特点是可以在磁盘等外存储器上高效地存储大量数据,并支持快速的查询、插入、删除等操作。 3、B树的结构类似于二叉搜…

ASUS华硕ZenBook 13灵耀U 2代U3300F笔记本UX333FN/FA原装出厂Win10系统工厂安装模式

系统自带所有驱动、出厂主题壁纸、系统属性华硕专属LOGO标志、Office办公软件、MyASUS华硕电脑管家等预装程序 下载链接:https://pan.baidu.com/s/1dK0vMZMECPlT63Rb6-jeFg?pwdbym5 所需要工具:16G或以上的U盘(非必需) 文件格式:HDI,SWP,O…

RocketMQ 消息丢失问题排查记录

现象 在 spring boot 项目中集成 RocketMQ 时发现消费者接收消息丢失,比如生产者发送了 10 条消息,但是消费者只能接收到 4 条。 在项目中使用的 RocketMQ 版本是 4.9.2,rocketmq-spring-boot-starter 版本是 2.2.2,消息处理逻辑…

聊聊并发编程——Condition

目录 一.synchronized wait/notify/notifyAll 线程通信 二.Lock Condition 实现线程通信 三.Condition实现通信分析 四.JUC工具类的示例 一.synchronized wait/notify/notifyAll 线程通信 关于线程间的通信,简单举例下: 1.创建ThreadA传入共享…

获取dom元素

<button type"button" click"greet">count is {{ count }}</button>function greet(event) {if (event) {console.log(event)console.log(event.target)console.log(event.target.tagName)} } 很明显没传参数&#xff0c;但是获取到了相应的值…