比如有如下目录:
src:
app
main.rs
render.rs
dyn_app
main.rs
render.rs
gui
mod.rs
macos_gui
mod.rs
factory.rs
windows_gui
mod.rs
factory.rs
然后我在tom文件中设定
[[bin]]
name = "app"
path = "src/app/main.rs"
[[bin]]
name = "dyn_app"
path = "src/dyn_app/main.rs"
这样就可以使用cargo run --bin
运行不同的main程序了,但是有个问题无论是app还是dyn_app都无法引用到根目录下的gui、macos_gui、windows_gui的东西。
use crate::macos_gui::factory::MacFactory;
use super::render::render;
// use windows_gui::factory::WindowsFactory;
fn main() {
let windows = false;
if windows {
// render(WindowsFactory);
} else {
render(MacFactory);
}
}
我在根目录下弄了一个mod.rs似乎也不行。所以想请教下正确的思路应该如何设计?谢谢
Ext Link:
1
共 11 条评论, 1 页
评论区
写评论模块引用问题。Cargo.toml里的workspace能解决
https://doc.rust-lang.org/book/ch14-03-cargo-workspaces.html
实际测试下来,最近的 cargo 应该是有些改进,src\bin\bin1.rs 和 examples\ex1.rs 的处理方法几乎是一样了。
相当于一个 隐形的 bin 类型的 crate 只有一个 main 对应 src\bin\bin1.rs ,然后加入主 crate 作为依赖,所以要有 src/lib.rs ,而且 bin 只能使用 pub 的 mod 。
这样的话 src\bin\bin1.rs 和 src\bin\bin2.rs 和 examples\ex1.rs 属于3个不同的 crate ,一个编译错误不会妨碍别的运行。
src/main.rs 内不定义 mod 时,也是通过 src/lib.rs 使用的,与上面的方法一样。
src/main.rs 特殊的点在于它可自成 mod 树根,定义 mod 后不用 src/lib.rs 。
多 bin 也可以,必须这样做:
use crate::gui;
不能用,必须写成use actual_crate_name::gui;
use actual_crate_name::gui;
cargo run
需要这个文件
src/lib.rs
,里面定义各个mod。另外,一般定义多个bin,是放在工作目录的根目录下放一个app或者是bin,与src同级,你这样感觉不伦不类的
[[]]
是定义一个 table array,[]
是定义一个 table,从文档上来看,lib 应该是只能有一个:所以用的是
[]
。你说的应该是另建一个lib工程是不?在原来的工程中我如果把Cargo.toml改成这样好像有问题。
会报
invalid type: map, expected a string in 'lib'
👇
TinusgragLin: 如果 crate 的类型就是 lib 的话,在其他 binary 里用
use [crate名字]
就可以引用这个 lib crate;如果类型是 binary 的话,可以像这样创建一个 lib,把公用的东西放在这个lib里:在其他 binary 里就可以用
use mylib
了。放bin不行吗?
如果 crate 的类型就是 lib 的话,在其他 binary 里用
use [crate名字]
就可以引用这个 lib crate;如果类型是 binary 的话,可以像这样创建一个 lib,把公用的东西放在这个lib里:在其他 binary 里就可以用
use mylib
了。因为这个是多个main文件分别在app和dyn_app目录下,而引用的模块是在他们的上层目录下,所以声明了也是有问题的。
--
👇
ankoGo: 你都还没在main中声明mod xxx
你都还没在main中声明mod xxx