如何在Rust中导入子模块中的宏?

如何在Rust中导入子模块中的宏?,rust,Rust,我有以下目录结构 /main.rs /lib.rs /tutorial/mod.rs /tutorial/foo.rs 在foo.rs中,我需要使用glium库中的宏,implement\u vertex。如果我把#[macro_use]放入外部板条箱胶质在foo.rs的头部,我得到了一个错误:“外部板条箱”加载宏必须在板条箱根目录下。我还得到一个错误:宏未定义:“实现顶点!” 还有一个lib.rs,它是教程模块的板条箱根。我需要把#[macro\u use]放在那里。如果我同时拥有main

我有以下目录结构

  • /main.rs
  • /lib.rs
  • /tutorial/mod.rs
  • /tutorial/foo.rs
foo.rs
中,我需要使用glium库中的宏,
implement\u vertex。如果我把
#[macro_use]放入外部板条箱胶质
foo.rs
的头部,我得到了一个
错误:“外部板条箱”加载宏必须在板条箱根目录下
。我还得到一个
错误:宏未定义:“实现顶点!”

还有一个
lib.rs
,它是教程模块的板条箱根。我需要把
#[macro\u use]
放在那里。如果我同时拥有
main.rs
lib.rs
,这会创建两个板条箱根吗


在子模块中导入宏的正确方法是什么?

按照编译器告诉您的那样执行:

加载宏的“外部板条箱”必须位于板条箱根目录下


#[macro_use]外部板条箱放入胶质在板条箱根目录中,在您的案例中是
main.rs
。确保
extern-crater
语句在
mod
语句之前,否则模块将无法访问导入的宏


然后,您可以在子模块中使用宏。

宏在编译阶段处理得足够早,因此顺序很重要。你,和我一样,可能变得越来越友好,习惯于用生锈的魔法来消除对使用顺序和板条箱声明的关注


将你的
#[macro_use]外置板条箱胶质语句添加到
lib.rs
和/或
main.rs
文件的顶部。

我解决了最初的问题。原来有两个货源?我有一个
lib.rs
和一个
main.rs
。原来把
#[macro\u use]
放在
lib.rs

的正确位置是的,这是我尝试的第一件事。它不起作用。我仍然得到错误:宏未定义:“实现顶点!”确保
extern-claiter
语句在
mod
语句之前,否则mod将无法访问导入的宏。除了
tests/common.rs
之外,我收到了相同的错误。那么,对于
test
目录,与
src/main.rs
src/lib.rs
类似的是什么呢?@VijaySali通常,
tests/
中的每个
.rs
文件都被编译为自己的小二进制文件箱,并将主库作为依赖项。因此,您必须添加
#[macro_use]外部板条箱glium位于每个文件的顶部。如果您通过
[[test]]
Cargo.toml
中手动添加测试,那么这些就是您的板条箱根。@VijaySali:正如Lukas在上面的评论中所解释的,解决方案是添加
外部板条箱内容到每个
测试/.rs
。另外,请注意,如果您想在每个测试文件中定义一组通用函数,那么不要将该通用文件定义为
tests/common.rs
,因为这将被
Cargo
视为另一个测试文件。改为定义
测试/common/mod.rs
。然后,您可以将
extern-clatecommon
添加到您的测试文件中。如果没有实际的代码,这只能通过盲目猜测来解决。我们所需要的只是结构,在哪里导入,在哪里使用。您如何编译(
cargo build
)?您是否修改了您的
货物.toml
?在哪个文件中是行
mod教程?在哪个文件中是行
mod foo?如果没有这些信息,我们只能猜测您的模块树的样子,如@DK。已经说过了。