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

这篇具有很好参考价值的文章主要介绍了CTP:关于cc和bindgen库及rust工程组织。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有三个工程目录,cpt-api, ctp-sdk,ctp-strategy
1、ctp-sdk:
主要的目的是基于bindgen库生成与cpp的.h文件相对应一个binding.rs文件,后面供策略使用。
CTP:关于cc和bindgen库及rust工程组织,XTP,CTP,Rust,javascript,开发语言,ecmascript

在这个目录下,建一个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:关于cc和bindgen库及rust工程组织,XTP,CTP,Rust,javascript,开发语言,ecmascript

ctp-types.rs文件:
CTP:关于cc和bindgen库及rust工程组织,XTP,CTP,Rust,javascript,开发语言,ecmascript由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即可。文章来源地址https://www.toymoban.com/news/detail-720993.html

到了这里,关于CTP:关于cc和bindgen库及rust工程组织的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Rust 工程配置

    发布配置 可自定义,对代码编译拥有更多的控制 cargo 主要有两个 profile dev profile, 开发阶段,cargo build relese profile 发布阶段 cargo build --release 在Cargo.toml中对相关属性进行修改 例如编译优化等级 opt-level 是编译优化等级,等级越高,代码优化越多,编译时间越长 文档注释 用于

    2024年01月24日
    浏览(11)
  • 【跟小嘉学 Rust 编程】十四、关于 Cargo 和 Crates.io

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学 Rust 编程】六、枚举

    2024年02月11日
    浏览(14)
  • 给 Web 前端工程师看的用 Rust 开发 wasm 组件实战

    wasm 全称 WebAssembly,是通过虚拟机的方式,可以在服务端、客户端如浏览器等环境执行的二进制程序。他有速度快、效率高、可移植的特点。 对我们 Web 前端工程最大的好处就是可以在浏览器端使用二进制程序处理一些计算量大的处理,使用他比 javascript 快的特点优化性能。

    2024年02月05日
    浏览(13)
  • No such file or directory (os error 2) : 关于树莓派32位配置rust环境后执行rustc相关命令出现的错误.

    问题的前因: 最新32位树莓派os安装scrapy时提示rust版本需要=1.48.0. 手动安装rust,配置rust环境变量后执行rustc,cargo等相关命令时出现如题错误,参考国外网站给出的解决方案 执行如下两条命令:

    2024年02月12日
    浏览(46)
  • 【Rust】Rust学习 第十七章Rust 的面向对象特性

    【Rust】Rust学习 第十七章Rust 的面向对象特性

    面向对象编程(Object-Oriented Programming,OOP)是一种模式化编程方式。对象(Object)来源于 20 世纪 60 年代的 Simula 编程语言。这些对象影响了 Alan Kay 的编程架构中对象之间的消息传递。他在 1967 年创造了  面向对象编程  这个术语来描述这种架构。关于 OOP 是什么有很多相互矛

    2024年02月11日
    浏览(12)
  • 研读Rust圣经解析——Rust learn-15(unsafe Rust )

    Rust 还隐藏有第二种语言,它不会强制执行这类内存安全保证:这被称为 不安全 Rust(unsafe Rust) 不安全 Rust 之所以存在,是因为静态分析本质上是保守的。当编译器尝试确定一段代码是否支持某个保证时,拒绝一些合法的程序比接受无效的程序要好一些。这必然意味着有时

    2024年02月01日
    浏览(9)
  • 【Rust教程 | 基础系列1 | Rust初相识】Rust简介与环境配置

    【Rust教程 | 基础系列1 | Rust初相识】Rust简介与环境配置

    Rust是一种系统编程语言,专注于速度、内存安全和并行性。它的设计目标是提供一种能够实现高性能系统的语言,同时保证内存安全和线程安全。 本篇教程的目标是通过融合理论与实践,帮助读者更快速、更有效地学习 Rust,并解决在学习过程中可能遇到的挑战。这些内容也

    2024年02月15日
    浏览(10)
  • 【Rust学习】安装Rust环境

    【Rust学习】安装Rust环境

    本笔记为了记录学习Rust过程,内容如有错误请大佬指教 使用IDE:vs code 参考教程:菜鸟教程链接: 菜鸟教程链接: 因为我已经安装过VSCode了,所以VSCode的安装方法在此处就不多介绍了,接下来就是安装Rust的编译工具。 Rust 编译工具 可以点击跳转下载Rust 编译工具 新建文件夹,

    2024年01月17日
    浏览(11)
  • 【Rust 基础篇】Rust 闭包

    在 Rust 中,闭包(closures)是一种函数对象,它可以捕获其环境中的变量,并在需要时调用。闭包提供了一种方便的方式来封装行为,并在需要时进行调用。本篇博客将详细介绍 Rust 中的闭包,包括闭包的定义、语法、捕获变量的方式以及一些常见的使用场景。 闭包在 Rust 中

    2024年02月16日
    浏览(11)
  • 【Rust 基础篇】Rust 封装

    在 Rust 中,封装是一种面向对象编程的重要概念,它允许将数据和相关的方法组合在一起,形成一个独立的单元。通过封装,我们可以隐藏数据的实现细节,只暴露需要对外部使用的接口,从而提高代码的可维护性和安全性。本篇博客将详细介绍 Rust 中封装的概念,包含代码

    2024年02月16日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包