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

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/srcbindings.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/4println!("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 changesprintln!("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 warningsFinished 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.hqwc.cn/news/121051.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs+vue 网上招聘系统elementui

第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:技术背景 5 3.2.2经济可行性 6 3.2.3操作可行性: 6 3.3 项目设计目标与原则 6 3.4系统流程分析 7 3.4.1操作流程 7 3.4.2添加信息流程 8 3.4.3删除信息流程 9 第4章 系统设计 11 …

linux-定时任务

目录 一、crond命令 1、什么是计划任务 2、crond服务的概念 3、crontab 二、at命令 1、at任务的概念 三、邮件服务 1、概念 2、启动postfix 四、mailx命令 1、三个概念: 2、交互式发邮件 3、非交互式发邮件 四、cron定时任务实践 1、系统定时任务配置…

【HUAWEI】单臂路由

目录 ​ 🥮写在前面 🥮2.1、拓扑图 🥮2.2、操作思路 🥮2.3、配置操作 🍣2.3.1、LSW4配置 🍣2.3.2、R2配置 🍣2.3.3、测试网络 🦐博客主页:大虾好吃吗的博客 &…

Cruise 从零搭建模型

第一步,新建一个project: 下面添加version: 将该新建的task加载进来,然后保存: 保存完之后,文件夹内多了很多内容: .prj 文件是工程文件。 .bdf 是存放模型里面的数据的文件。 可以看出&#…

ElementUI之首页导航+左侧菜单->mockjs,总线

mockjs总线 1.mockjs 什么是Mock.js 前后端分离开发开发过程当中,经常会遇到以下几个尴尬的场景: - 老大,接口文档还没输出,我的好多活干不下去啊! - 后端小哥,接口写好了没,我要测试啊&#x…

springcloud之自我介绍

写在前面 在这篇文章 中我们分析了单体应用的问题,以及用来解决这些问题的解决的方案微服务,并接着看了微服务需要考虑的各种,如服务调用,负载均衡,服务治理,链路追踪,分布式事务,等…

Linux多线程【线程互斥与同步】

✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌇前言🏙️正文1、资源共享问题1.1、多线程并发访问1.2、临界区与临界资源1.3、“锁” 概念引…

用于自然语言处理的 Python:理解文本数据

一、说明 Python是一种功能强大的编程语言,在自然语言处理(NLP)领域获得了极大的普及。凭借其丰富的库集,Python 为处理和分析文本数据提供了一个全面的生态系统。在本文中,我们将介绍 Python for NLP 的一些基础知识&…

提升 Windows 生产力的实用工具集:Microsoft PowerToys | 开源日报 No.42

microsoft/PowerToys Stars: 95.2k License: MIT Microsoft PowerToys 是一套用于调整和优化 Windows 体验以提高生产力的实用工具集。该项目包含多个功能模块,其中主要功能有:Always on Top、FancyZones、File Explorer Add-ons 等。其核心优势和关键特…

Java开源工具库使用之Lombok

文章目录 前言一、常用注解1.1 AllArgsConstructor/NoArgsConstructor/RequiredArgsConstructor1.2 Builder1.3 Data1.4 EqualsAndHashCode1.5 Getter/Setter1.6 Slf4j/Log4j/Log4j2/Log1.7 ToString 二、踩坑2.1 Getter/Setter 方法名不一样2.2 Builder 不会生成无参构造方法2…

FPGA 多路视频处理:图像缩放+视频拼接显示,HDMI采集,提供2套工程源码和技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐FPGA图像缩放方案推荐FPGA视频拼接方案推荐 3、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条缓冲FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 视频拼接算法图像缓存视频输出 4、vivado工程1&am…

Python大数据之Python进阶(四)进程的注意点

文章目录 进程的注意点1. 进程的注意点介绍2. 进程之间不共享全局变量3. 进程之间不共享全局变量的小结4. 主进程会等待所有的子进程执行结束再结束5. 主进程会等待所有的子进程执行结束再结束的小结 进程的注意点 学习目标 能够说出进程的注意点 1. 进程的注意点介绍 进程之…