2016-11-09 11 views
2

我想提出一个包含项目:如何使用Cargo将库建立为rlib和dylib但内容不同?

  • 绑定对于C
  • 使用该库

的目录结构的可执行文件,不包括临时文件和其他垃圾:

. 
├── Cargo.toml 
├── src 
│   ├── c_bindings.rs // contains C bindings for library 
│   ├── compression.rs 
│   ├── const_data.rs 
│   ├── hash.rs 
│   ├── lib.rs // library 
│   └── main.rs // simple executable that uses library 
└── target 
    └── debug 
     ├── gost_stribog 
     ├── libgost_stribog.rlib 

我想要cargo build做到这一点:

  • 构建锈库(rlib)将忽略c_bindings.rs
  • C库(dylib)将使用c_bindings.rs
  • 可执行

调试目录应该是:

└── target 
    └── debug 
     ├── gost_stribog 
     ├── libgost_stribog.rlib 
     ├── libgost_stribog.so 

我的Cargo.toml应该是什么样子?

回答

2

意见回答:不要

相反,拆你的代码为两个或三个独立的包装箱:

  1. 的核心库。
  2. 库的C绑定。
  3. (可选)可执行文件。

然后,将您的c_bindings.rs移动到绑定箱,只是lib.rs。它可以依赖于核心库。您还可以将main.rs移动到另一个也取决于核心库的包。

这三个板条箱可以位于同一个源代码库中,但将使用单独的调用进行构建。

A Cargo workspace可能证明是有用的;实际上它被列为明确的原因(“FFI箱子和FFI绑定的子箱子”)。

+0

@Flowneee RFC states *“工作空间最终可以通过'--all'标志扩展,所以在工作空间的根目录下你可以执行'cargo build --all'来编译所有的箱子”*。但是,在完成之前,您需要切换到每个箱子的目录并运行'cargo build'。一个小小的'Makefile'或shell脚本可能有助于缩小差距,直到实现'--all'。 – Shepmaster

相关问题