ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 Cargo 构建多个二进制文件?

我想制作一个带有 daemonclient 的项目,通过 unix 套接字连接。

clientdaemon 需要两个二进制文件,那么我如何告诉 Cargo 从两个不同的源构建两个目标?

为了增加一点幻想,我想有一个 library 作为 daemon 的主要部分,并且只用一个二进制文件来包装它并通过套接字进行通信。

所以,我们有这种树结构:

├── Cargo.toml
├── target
|   └── debug
|       ├── daemon
│       └── client
└── src
    ├── daemon
    │   ├── bin
    │   │   └── main.rs
    │   └── lib
    │       └── lib.rs
    └── client
        └── bin
            └── main.rs

我可以制作一个管理这两个问题的可执行文件,但这不是我想要做的,除非这是非常好的做法。

作为Dognert's答案的补充,他们回答了我得到的所有问题。十分感谢!

D
Dogbert

您可以使用 [[bin]] 指定多个二进制文件,如 here 所述:

[[bin]]
name = "daemon"
path = "src/daemon/bin/main.rs"

[[bin]]
name = "client"
path = "src/client/bin/main.rs"

提示:如果您将这些文件放在 src/bin/daemon.rssrc/bin/client.rs 中,您将获得两个名为 daemonclient 的可执行文件,因为 Cargo 会自动将 src/bin 中的所有文件编译成具有相同名称的可执行文件。仅当您不遵循此约定时,您才需要像上面的代码片段一样指定名称和路径。


我已经查看了 Cargo 的文档,但是我什么都看不到,您可以指定输出来存储二进制文件吗?例如 pathTo: "/some/path" 对不起我的英语。
如果您认为最好就此提出问题,我可以毫无问题地做到这一点,可能更容易找到有相同问题的其他人?
@AngelAngel 你想自定义输出路径吗?默认情况下,它将存储在 target/debug/$name 中,其中 $name 是您在 Cargo.toml 中指定的 name
我只是想知道您是否可以说出在默认位置以外的其他地方安装二进制文件副本的位置。 $name 中的一个副本和另一个路径中的另一个副本。并不是说它是微不足道的,只是好奇,感谢您的时间。
如果其中一个 [[bin]] 使用 required-features,这将不起作用。为此,似乎 cargo workspace 是唯一的解决方案?
S
Shepmaster

另一种方法是使用 the workspace feature。由于我们可以拥有多个库,因此这将提供更大的灵活性。示例项目结构:

.
├── Cargo.toml
├── cli
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── core
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
├── daemon
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── gui
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── rpc
    ├── Cargo.toml
    └── src
        └── lib.rs

Cargo.toml 的内容:

[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]

我无法让它工作。我不得不移动 src/ 文件夹中的二进制 rust 源并在 [[bin]] 中指定另一个目标。您能否详细说明您为使其正常工作所做的工作?我收到以下错误:use ::engine::RuleEngine; could not find engine in {{root}}
@KennyBambridge 我有一段时间没有研究 Rust。 IIRC 当我创建这个答案时,我在本地机器上尝试过,它按预期工作。
@KennyBambridge您必须在其他工作区中添加板条箱作为您要使用它们的 Cargo.toml 中的依赖项。
我看到 filecoin 使用这种代码结构:github.com/filecoin-project/rust-fil-proofs
我得到了它的工作,但我最终参考了不同的 Workspace 文档,即 Rust 书中的一个:doc.rust-lang.org/book/ch14-03-cargo-workspaces.html
R
Robust Systems 8472-1488

如果您有一个大型项目,另一种格式可能是复制 Crates.io source code 所做的事情,例如:

src 中的主库,带有一个包含可执行文件的 Bin 文件夹。然后从您的可执行文件调用您的主库 crate。

这样,您的库是集中的,因此在缓存时更容易找到内容。