如何在my_project/src/include_me.rs
?
main.rs
的文件
我检查了dependencies guide,所有这些似乎都包含了二进制文件。我还检查了"The Book",但其中没有一个例子以“.rs”结尾。
如何使include_me.rs
与项目的其余部分一起编译?
编辑:虽然“可能重复”将是一个包含这个问题答案的好地方,但它并不包含它。这个问题的最佳答案中的语法更加相关,并在“重复”的问题中掩盖了
答案 0 :(得分:19)
Rust中基本上有两种(主要)方式来包含来自其他地方的代码:
如果您的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();
}
mod
声明使Rust编译器自动查找相应的.rs
文件!
因此,属于您项目的所有内容属于与main.rs
(或lib.rs
)所在的文件夹相同的文件夹(或其子文件夹)。然后包含文件""通过模块系统。要阅读有关模块的详细介绍,请阅读the chapter on modules in the Rust book。模块系统非常重要,因此对学习Rust非常重要。
如果您的include_me.rs
不属于您的实际项目,而是您在多个项目中使用的有用内容的集合,则应将其视为库< / em>的。要包含此类外部库的代码,您必须将其包含在extern crate中。为了让您的生活更轻松,您真的想要使用Cargo!
因此,让我们准备您的include_me.rs
货物图书馆项目。您需要以下文件结构(由cargo new my_library --lib
自动生成):
. my_library
├── Cargo.toml
└── src
└── lib.rs
现在将include_me.rs
中的所有内容复制到lib.rs
(只需调用库项目lib.rs
的根文件)。我们假设my_library
文件夹的完整路径是~/code/my_library
。
现在让我们准备您的主项目的货运项目。它有一个类似的文件
结构(但是main.rs
而不是lib.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注册表,如果您的公司有一个)进行交互,但这是另一个主题。
(注意:前段时间,有必要在extern crate my_library;
内写main.rs
。这已经不再需要了,但你可能会发现感冒了{{1声明。)
是的,但你不应该使用它们。 the include!()
macro允许您逐字包含其他文件,就像来自C-land的extern crate
一样。 然而,强烈建议不要在模块系统能够解决您的问题的情况下使用它。 #include
仅在非常特殊的情况下有用,通常与生成代码的更复杂的构建系统相关联。