如何在main.rs
中包含具有完整路径my_project/src/include_me.rs
的文件
我检查了dependencies guide,所有的文件似乎都包含一个二进制文件。我还检查了"The Book",但没有一个示例以".rs“结尾。
如何让include_me.rs
与项目的其余部分一起编译?
编辑:虽然“可能的副本”是一个很好的地方来包含这个问题的答案,但它并不包含它。这个问题的顶部答案中的语法明显更相关,并且在它“重复”的问题中被注释掉了。
发布于 2017-08-05 16:57:08
在Rust中,基本上有两种(主要)方式来包含来自其他地方的代码:
1.“包含”内部代码
如果您的include_me.rs
属于您的项目,则应将其移动到main.rs
所在的同一文件夹中:
└── src
├── include_me.rs
└── main.rs
然后你可以在你的main.rs
中写这段代码
mod include_me;
fn main() {
// Call a function defined in the other file (module)
include_me::some_function();
}
Rust声明使mod
编译器自动查找相应的.rs
文件!
因此,属于您的项目的所有内容与main.rs
(或lib.rs
)所在的文件夹属于同一文件夹(或其子文件夹)。然后通过模块系统“包含”这些文件。要阅读模块的介绍,请阅读the chapter on modules in the Rust book。您也可以查看有关该主题的Rust by Example。模块系统非常重要,因此对学习Rust非常重要。
2.“包括”外部代码
如果您的include_me.rs
不属于您的实际项目,而是您在多个项目中使用的有用内容的集合,那么它应该被视为一个库。要包含此类外部库的代码,您必须将其包含为外部机箱。为了让你的生活更轻松,你真的很想使用Cargo!
所以让我们准备你的include_me.rs
as Cargo库项目。您需要以下文件结构(由cargo new my_library --lib
自动生成):
. my_library
├── Cargo.toml
└── src
└── lib.rs
现在将include_me.rs
中的所有内容复制到lib.rs
中(按照惯例,将库项目的根文件称为lib.rs
)。假设my_library
文件夹的完整路径为~/code/my_library
。
现在让我们准备主项目的Cargo项目。它具有类似的文件结构(但不是lib.rs
,而是main.rs
,因为它是可执行项目,而不是库项目):
. my_project
├── Cargo.toml
└── src
└── main.rs
要声明对my_library
的依赖,必须将以下内容放入Cargo.toml
中
[package]
name = "my_project"
version = "0.1.0"
authors = ["you"]
edition = "2018"
[dependencies]
my_library = { path = "~/code/my_library" }
您也可以使用相对路径("../my_library"
),但只有当您知道这两个项目始终保持其相对于彼此的位置(例如,如果它们都在同一个存储库中进行管理)时,它才有意义。
现在,你可以在你的main.rs
中写下:
use my_library::some_function();
fn main() {
// Call a function defined in the other file (extern crate)
some_function();
}
如果你想上传这两个项目中的任何一个,你必须与crates.io
(如果你的公司有另一个crates注册表)进行交互,但这是另一个主题。
(注意:不久前,在main.rs
中编写extern crate my_library;
是必要的。这不再是必需的,但是您可能会发现带有extern crate
声明的旧代码。)
还有别的办法吗?
是的,但是你不应该使用那些。有一个the include!()
macro可以让你逐字地包含其他文件,就像C-land中的#include
一样。然而,强烈建议在模块系统能够解决您的问题的情况下使用它。include!()
只有在非常特殊的情况下才有用,通常链接到生成代码的更复杂的构建系统。
https://stackoverflow.com/questions/45519176
复制相似问题