如何构建 Rust 二进制可执行文件。

5

我正在尝试构建一个单独的Rust二进制可执行文件。在src目录中,我有四个文件:

main.rs:

use fasta_multiple_cmp::get_filenames;

fn main() {
    get_filenames();
}

mod.rs:

pub mod fasta_multiple_cmp;

pub mod build_sequences_matrix;

fasta_multiple_cmp.rs:

pub mod fasta_multiple_cmp {

...

    pub fn get_filenames() {
    let args: Vec<String> = env::args().collect();
    ...

build_sequences_matrix.rs:

pub mod build_sequences_matrix {

    use simple_matrix::Matrix;
    ...

Cargo 告诉我:

src/main.rs:3:5 | 3 | use fasta_multiple_cmp::get_filenames; | ^^^^^^^^^^^^^^^^^^ 使用了未声明的 crate 或模块 `fasta_multiple_cmp`

我觉得自己理解了一些东西,但是现在我迷失了。到底发生了什么?

感谢任何提示!


2
不要把 pub mod 的东西放在你的 fasta_multiple_cmp.rsbuild_sequences_matrix.rs 中。另外,我不确定,但你可能需要将 pub mod fasta_multiple_cmp;mod.rs 移动到 main.rs - Aplet123
非常感谢!现在已经构建完成。 - Laurent Bloch
这个回答解决了你的问题吗?当存在main.rs和lib.rs时,Rust模块会引起混淆 - BallpointBen
1个回答

6

您原先的代码无法运行是因为Rust的 use 用于从crate中引入模块,而不仅仅是从相同目录下的文件中引入。

如果您想要将逻辑分开到其他文件中,您需要将项目拆分成一个二进制文件和一个库(也就是 - 您的二进制文件可以用来导入的crate)。

这可以通过您的 Cargo.toml 文件实现:

[package]
edition = "2018"
name = "my_project"
version = "1.2.3"

... your other settings ...

[[bin]]
edition = "2018"
name = "whatever_name_for_binary"
path = "src/main.rs"

这意味着您的二进制文件将被编译成一个名为"whatever_name_for_binary"的文件,存放在target文件夹中。同时,非二进制文件充当库文件,可以通过使用use my_project::some_module;由您的二进制文件导入。

由于项目现在包含库和二进制文件,因此需要在想要运行/编译二进制文件时进行指定。

您可以通过运行以下命令来实现: cargo run --bin whatever_name_for_binary

有关更多信息,请参见Rust Book有关模块的章节。(Rust Book's Chapter on Modules).


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接