< 返回版块

pader 发表于 2020-06-17 22:00

Tags:bin, mod

假如程序有多个 bin,使用默认的规则在 src/bin 目录中建一个 hello.rs 的文件,配置好后就可以构建出 hello 的二进制可执行文件。

但是有些 mod 比如在 src/mymod 中建立了一个 mod,这时在 src/main.rs 中是可以使用 mod mymod; 使用 mymod 中的功能的,但是在 bin 中完全找不到任何方法引用,试过所谓的 crate:: super:: 都完全无用。

/bin/hello.rs
/main.rs
/mymod/mod.rs

难道为了把 bin 统一放在 bin 目录,所有的 mod 就都得放到 bin 目录中去??这不是扯吗?

Cargo: 1.44.0
Rustup: 1.21.1

评论区

写评论
作者 pader 2020-06-20 00:02

可是这样要求必须有一个 lib 才行,实际上主目录(src)下可能有很多的mod目录,这样得要求lib把他们全暴露出来? 对以下内容的回复:

青鱼🐟 2020-06-19 16:08

这样子引用。

> cd demo
> tree
.
├── Cargo.lock
├── Cargo.toml
└── src
    ├── bin
    │   └── main.rs
    └── lib.rs
// src/lib.rs

pub fn hello() {
    println!("Hello, World!");
}

// src/bin/main.rs

use demo; // package name in your Cargo.toml

fn main() {
    demo::hello();
}

songzhi 2020-06-17 23:16

用crate名引用,比如crate叫foo,就直接foo::bar。bin文件夹下面的文件是把你写的crate当成一个依赖。

作者 pader 2020-06-17 22:38

目前找到一个方法,就是在 Cargo.toml 中定义一个 lib。

[lib]
name = "inc"
path = "src/mymod/mod.rs"

如果 mymod 中还有其它的模块,比如 mojo.rs,则在 mod.rs 中使用 pub mod mojo

然后在 bin/hello.rs 中直接 use。

use inc::hello;
use inc::mojo::mojohello;

还没找到其它更优雅的办法。。

貌似 bin 目录下的东西并不在整个树里面。

1 共 4 条评论, 1 页