如何使用Cargo以rlib和dylib的形式构建一个具有不同内容的库?

Flo*_*eee 3 rust rust-cargo

我想制作一个包含以下内容的项目:

  • 图书馆
  • 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
Run Code Online (Sandbox Code Playgroud)

cargo build要这样做:

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

调试目录应为:

??? target
    ??? debug
        ??? gost_stribog
        ??? libgost_stribog.rlib
        ??? libgost_stribog.so
Run Code Online (Sandbox Code Playgroud)

我应该是什么Cargo.toml样?

She*_*ter 5

有意见的答案:不要

而是将您的代码分成两个或三个单独的板条箱:

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

然后,将您c_bindings.rs移到绑定板条箱中,就像lib.rs。它可以取决于核心库。您还可以移至main.rs另一个依赖于核心库的板条箱。

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

货物工作区可能被证明是有用的;实际上,它被列为一个明确的原因(“一个FFI板条箱带有一个用于FFI绑定的子板条箱”)。