如何在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]外置板条箱胶质根据需要将code>语句添加到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。已经说过了。