一、 环境准备:
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就自动生成了。
来源:oschina
链接:https://my.oschina.net/u/4393724/blog/4660506